35
35
#include "drizzled/field/str.h"
36
36
#include "drizzled/field/num.h"
37
38
#include "drizzled/field/blob.h"
39
#include "drizzled/field/date.h"
40
#include "drizzled/field/datetime.h"
41
#include "drizzled/field/decimal.h"
42
#include "drizzled/field/double.h"
38
43
#include "drizzled/field/enum.h"
44
#include "drizzled/field/epoch.h"
45
#include "drizzled/field/int32.h"
46
#include "drizzled/field/int64.h"
47
#include "drizzled/field/microtime.h"
39
48
#include "drizzled/field/null.h"
40
#include "drizzled/field/date.h"
41
#include "drizzled/field/decimal.h"
42
49
#include "drizzled/field/real.h"
43
#include "drizzled/field/double.h"
44
#include "drizzled/field/long.h"
45
#include "drizzled/field/int64_t.h"
46
#include "drizzled/field/num.h"
47
#include "drizzled/field/timestamp.h"
48
#include "drizzled/field/datetime.h"
50
#include "drizzled/field/size.h"
51
#include "drizzled/field/time.h"
49
52
#include "drizzled/field/varstring.h"
50
54
#include "drizzled/internal/m_string.h"
133
142
String *Item::val_string_from_decimal(String *str)
135
my_decimal dec_buf, *dec= val_decimal(&dec_buf);
144
type::Decimal dec_buf, *dec= val_decimal(&dec_buf);
139
my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
140
my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, 0, str);
148
class_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
149
class_decimal2string(&dec_buf, 0, str);
144
my_decimal *Item::val_decimal_from_real(my_decimal *decimal_value)
153
type::Decimal *Item::val_decimal_from_real(type::Decimal *decimal_value)
146
155
double nr= val_real();
150
double2my_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
159
double2_class_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
151
160
return (decimal_value);
154
my_decimal *Item::val_decimal_from_int(my_decimal *decimal_value)
163
type::Decimal *Item::val_decimal_from_int(type::Decimal *decimal_value)
156
165
int64_t nr= val_int();
160
int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
169
int2_class_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
161
170
return decimal_value;
164
my_decimal *Item::val_decimal_from_string(my_decimal *decimal_value)
173
type::Decimal *Item::val_decimal_from_string(type::Decimal *decimal_value)
184
192
return decimal_value;
187
my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
195
type::Decimal *Item::val_decimal_from_date(type::Decimal *decimal_value)
191
if (get_date(<ime, TIME_FUZZY_DATE))
199
if (get_date(ltime, TIME_FUZZY_DATE))
193
my_decimal_set_zero(decimal_value);
201
decimal_value->set_zero();
194
202
null_value= 1; // set NULL, stop processing
197
return date2my_decimal(<ime, decimal_value);
205
return date2_class_decimal(<ime, decimal_value);
200
my_decimal *Item::val_decimal_from_time(my_decimal *decimal_value)
208
type::Decimal *Item::val_decimal_from_time(type::Decimal *decimal_value)
204
if (get_time(<ime))
206
my_decimal_set_zero(decimal_value);
214
decimal_value->set_zero();
209
return date2my_decimal(<ime, decimal_value);
217
return date2_class_decimal(<ime, decimal_value);
212
220
double Item::val_real_from_decimal()
214
222
/* Note that fix_fields may not be called for Item_avg_field items */
216
my_decimal value_buff, *dec_val= val_decimal(&value_buff);
224
type::Decimal value_buff, *dec_val= val_decimal(&value_buff);
219
my_decimal2double(E_DEC_FATAL_ERROR, dec_val, &result);
227
class_decimal2double(E_DEC_FATAL_ERROR, dec_val, &result);
225
233
/* Note that fix_fields may not be called for Item_avg_field items */
227
my_decimal value, *dec_val= val_decimal(&value);
235
type::Decimal value, *dec_val= val_decimal(&value);
230
my_decimal2int(E_DEC_FATAL_ERROR, dec_val, unsigned_flag, &result);
239
dec_val->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
234
int Item::save_time_in_field(Field *field)
244
bool Item::save_time_in_field(Field *field)
237
if (get_time(<ime))
238
249
return set_field_to_null(field);
239
251
field->set_notnull();
240
return field->store_time(<ime, DRIZZLE_TIMESTAMP_TIME);
253
return field->store_time(ltime, type::DRIZZLE_TIMESTAMP_TIME);
243
int Item::save_date_in_field(Field *field)
256
bool Item::save_date_in_field(Field *field)
246
if (get_date(<ime, TIME_FUZZY_DATE))
260
if (get_date(ltime, TIME_FUZZY_DATE))
247
261
return set_field_to_null(field);
248
263
field->set_notnull();
249
return field->store_time(<ime, DRIZZLE_TIMESTAMP_DATETIME);
265
return field->store_time(ltime, type::DRIZZLE_TIMESTAMP_DATETIME);
276
294
with_sum_func(false),
277
295
is_autogenerated_name(true),
278
296
with_subselect(false),
279
collation(&my_charset_bin, DERIVATION_COERCIBLE)
297
collation(&my_charset_bin, DERIVATION_COERCIBLE),
298
_session(*current_session)
281
300
cmp_context= (Item_result)-1;
283
302
/* Put item in free list so that we can free all items at end */
284
Session *session= current_session;
285
next= session->free_list;
286
session->free_list= this;
303
next= getSession().free_list;
304
getSession().free_list= this;
289
307
Item constructor can be called during execution other then SQL_COM
290
308
command => we should check session->lex->current_select on zero (session->lex
291
309
can be uninitialised)
293
if (session->lex->current_select)
311
if (getSession().lex->current_select)
295
enum_parsing_place place= session->lex->current_select->parsing_place;
313
enum_parsing_place place= getSession().getLex()->current_select->parsing_place;
296
314
if (place == SELECT_LIST || place == IN_HAVING)
297
session->lex->current_select->select_n_having_items++;
315
getSession().getLex()->current_select->select_n_having_items++;
452
471
return conv->safe ? conv : NULL;
455
bool Item::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
474
bool Item::get_date(type::Time <ime,uint32_t fuzzydate)
457
if (result_type() == STRING_RESULT)
460
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
461
if (!(res=val_str(&tmp)) ||
462
str_to_datetime_with_warn(res->ptr(), res->length(),
463
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
468
int64_t value= val_int();
470
if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == -1L)
473
end= internal::int64_t10_to_str(value, buff, -10);
474
make_truncated_value_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
475
buff, (int) (end-buff), DRIZZLE_TIMESTAMP_NONE,
483
memset(ltime, 0, sizeof(*ltime));
482
else if (result_type() == STRING_RESULT)
484
char buff[type::Time::MAX_STRING_LENGTH];
485
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
486
if (!(res=val_str(&tmp)) ||
487
str_to_datetime_with_warn(&getSession(), res->ptr(), res->length(),
488
<ime, fuzzydate) <= type::DRIZZLE_TIMESTAMP_ERROR)
495
int64_t value= val_int();
496
type::datetime_t date_value;
498
ltime.convert(date_value, value, fuzzydate);
500
if (not type::is_valid(date_value))
502
char buff[DECIMAL_LONGLONG_DIGITS], *end;
503
end= internal::int64_t10_to_str(value, buff, -10);
504
make_truncated_value_warning(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
505
buff, (int) (end-buff), type::DRIZZLE_TIMESTAMP_NONE, NULL);
487
bool Item::get_time(DRIZZLE_TIME *ltime)
518
bool Item::get_time(type::Time <ime)
520
char buff[type::Time::MAX_STRING_LENGTH];
490
521
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
491
if (!(res=val_str(&tmp)) ||
492
str_to_time_with_warn(res->ptr(), res->length(), ltime))
522
if (!(res=val_str(&tmp)) or
523
str_to_time_with_warn(&getSession(), res->ptr(), res->length(), <ime))
494
memset(ltime, 0, sizeof(*ltime));
500
bool Item::get_date_result(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
533
bool Item::get_date_result(type::Time <ime,uint32_t fuzzydate)
502
return get_date(ltime,fuzzydate);
535
return get_date(ltime, fuzzydate);
505
538
bool Item::is_null()
1163
1208
case DRIZZLE_TYPE_LONG:
1164
field= new Field_long((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1165
name, 0, unsigned_flag);
1209
field= new field::Int32((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1167
1211
case DRIZZLE_TYPE_LONGLONG:
1168
field= new Field_int64_t((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1169
name, 0, unsigned_flag);
1212
field= new field::Int64((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1171
1214
case DRIZZLE_TYPE_DOUBLE:
1172
1215
field= new Field_double((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1173
name, decimals, 0, unsigned_flag);
1216
name, decimals, 0, unsigned_flag);
1175
1218
case DRIZZLE_TYPE_NULL:
1176
1219
field= new Field_null((unsigned char*) 0, max_length, name, &my_charset_bin);
1178
1221
case DRIZZLE_TYPE_DATE:
1179
1222
field= new Field_date(maybe_null, name, &my_charset_bin);
1225
case DRIZZLE_TYPE_MICROTIME:
1226
field= new field::Microtime(maybe_null, name);
1181
1229
case DRIZZLE_TYPE_TIMESTAMP:
1182
field= new Field_timestamp(maybe_null, name, &my_charset_bin);
1230
field= new field::Epoch(maybe_null, name);
1184
1232
case DRIZZLE_TYPE_DATETIME:
1185
1233
field= new Field_datetime(maybe_null, name, &my_charset_bin);
1188
/* This case should never be chosen */
1190
/* Fall through to make_string_field() */
1235
case DRIZZLE_TYPE_TIME:
1236
field= new field::Time(maybe_null, name, &my_charset_bin);
1238
case DRIZZLE_TYPE_BOOLEAN:
1239
case DRIZZLE_TYPE_UUID:
1191
1240
case DRIZZLE_TYPE_ENUM:
1192
1241
case DRIZZLE_TYPE_VARCHAR:
1193
1242
return make_string_field(table);
1329
1380
enum_field_types f_type;
1331
1382
switch ((f_type=field_type())) {
1383
case DRIZZLE_TYPE_DATE:
1333
1384
case DRIZZLE_TYPE_NULL:
1334
1385
case DRIZZLE_TYPE_ENUM:
1335
1386
case DRIZZLE_TYPE_BLOB:
1336
1387
case DRIZZLE_TYPE_VARCHAR:
1388
case DRIZZLE_TYPE_BOOLEAN:
1389
case DRIZZLE_TYPE_UUID:
1337
1390
case DRIZZLE_TYPE_DECIMAL:
1340
if ((res=val_str(buffer)))
1341
result= client->store(res->ptr(),res->length());
1393
if ((res=val_str(buffer)))
1394
result= client->store(res->ptr(),res->length());
1344
1397
case DRIZZLE_TYPE_LONG:
1349
result= client->store((int32_t)nr);
1402
result= client->store((int32_t)nr);
1352
1405
case DRIZZLE_TYPE_LONGLONG:
1359
result= client->store((uint64_t)nr);
1361
result= client->store((int64_t)nr);
1412
result= client->store((uint64_t)nr);
1414
result= client->store((int64_t)nr);
1365
1418
case DRIZZLE_TYPE_DOUBLE:
1367
double nr= val_real();
1369
result= client->store(nr, decimals, buffer);
1420
double nr= val_real();
1422
result= client->store(nr, decimals, buffer);
1425
case DRIZZLE_TYPE_TIME:
1430
result= client->store(&tm);
1372
1433
case DRIZZLE_TYPE_DATETIME:
1434
case DRIZZLE_TYPE_MICROTIME:
1373
1435
case DRIZZLE_TYPE_TIMESTAMP:
1376
get_date(&tm, TIME_FUZZY_DATE);
1378
result= client->store(&tm);
1438
get_date(tm, TIME_FUZZY_DATE);
1440
result= client->store(&tm);
1382
1444
if (null_value)
1383
1445
result= client->store();
1450
uint32_t Item::max_char_length() const
1452
return max_length / collation.collation->mbmaxlen;
1455
void Item::fix_length_and_charset(uint32_t max_char_length_arg, CHARSET_INFO *cs)
1457
max_length= char_to_byte_length_safe(max_char_length_arg, cs->mbmaxlen);
1458
collation.collation= cs;
1461
void Item::fix_char_length(uint32_t max_char_length_arg)
1463
max_length= char_to_byte_length_safe(max_char_length_arg, collation.collation->mbmaxlen);
1466
void Item::fix_char_length_uint64_t(uint64_t max_char_length_arg)
1468
uint64_t max_result_length= max_char_length_arg *
1469
collation.collation->mbmaxlen;
1471
if (max_result_length >= MAX_BLOB_WIDTH)
1473
max_length= MAX_BLOB_WIDTH;
1478
max_length= max_result_length;
1482
void Item::fix_length_and_charset_datetime(uint32_t max_char_length_arg)
1484
collation.set(&my_charset_bin);
1485
fix_char_length(max_char_length_arg);
1387
1488
Item_result item_cmp_type(Item_result a,Item_result b)
1389
1490
if (a == STRING_RESULT && b == STRING_RESULT)
1390
1491
return STRING_RESULT;
1391
1493
if (a == INT_RESULT && b == INT_RESULT)
1392
1494
return INT_RESULT;
1393
1495
else if (a == ROW_RESULT || b == ROW_RESULT)
1394
1496
return ROW_RESULT;
1395
1498
if ((a == INT_RESULT || a == DECIMAL_RESULT) &&
1396
1499
(b == INT_RESULT || b == DECIMAL_RESULT))
1397
1500
return DECIMAL_RESULT;
1398
1502
return REAL_RESULT;
1411
1515
switch (res_type) {
1412
1516
case STRING_RESULT:
1414
char buff[MAX_FIELD_WIDTH];
1415
String tmp(buff,sizeof(buff),&my_charset_bin),*result;
1416
result=item->val_str(&tmp);
1417
if (item->null_value)
1418
new_item= new Item_null(name);
1421
uint32_t length= result->length();
1422
char *tmp_str= memory::sql_strmake(result->ptr(), length);
1423
new_item= new Item_string(name, tmp_str, length, result->charset());
1518
char buff[MAX_FIELD_WIDTH];
1519
String tmp(buff,sizeof(buff),&my_charset_bin),*result;
1520
result=item->val_str(&tmp);
1521
if (item->null_value)
1522
new_item= new Item_null(name);
1525
uint32_t length= result->length();
1526
char *tmp_str= memory::sql_strmake(result->ptr(), length);
1527
new_item= new Item_string(name, tmp_str, length, result->charset());
1427
1531
case INT_RESULT:
1429
int64_t result=item->val_int();
1430
uint32_t length=item->max_length;
1431
bool null_value=item->null_value;
1432
new_item= (null_value ? (Item*) new Item_null(name) :
1433
(Item*) new Item_int(name, result, length));
1533
int64_t result=item->val_int();
1534
uint32_t length=item->max_length;
1535
bool null_value=item->null_value;
1536
new_item= (null_value ? (Item*) new Item_null(name) :
1537
(Item*) new Item_int(name, result, length));
1436
1540
case ROW_RESULT:
1437
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
1440
Substitute constants only in Item_rows. Don't affect other Items
1441
with ROW_RESULT (eg Item_singlerow_subselect).
1541
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
1544
Substitute constants only in Item_rows. Don't affect other Items
1545
with ROW_RESULT (eg Item_singlerow_subselect).
1443
For such Items more optimal is to detect if it is constant and replace
1444
it with Item_row. This would optimize queries like this:
1445
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
1447
Item_row *item_row= (Item_row*) item;
1448
Item_row *comp_item_row= (Item_row*) comp_item;
1452
If item and comp_item are both Item_rows and have same number of cols
1453
then process items in Item_row one by one.
1454
We can't ignore NULL values here as this item may be used with <=>, in
1455
which case NULL's are significant.
1457
assert(item->result_type() == comp_item->result_type());
1458
assert(item_row->cols() == comp_item_row->cols());
1459
col= item_row->cols();
1461
resolve_const_item(session, item_row->addr(col),
1462
comp_item_row->element_index(col));
1547
For such Items more optimal is to detect if it is constant and replace
1548
it with Item_row. This would optimize queries like this:
1549
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
1551
Item_row *item_row= (Item_row*) item;
1552
Item_row *comp_item_row= (Item_row*) comp_item;
1556
If item and comp_item are both Item_rows and have same number of cols
1557
then process items in Item_row one by one.
1558
We can't ignore NULL values here as this item may be used with <=>, in
1559
which case NULL's are significant.
1561
assert(item->result_type() == comp_item->result_type());
1562
assert(item_row->cols() == comp_item_row->cols());
1563
col= item_row->cols();
1565
resolve_const_item(session, item_row->addr(col),
1566
comp_item_row->element_index(col));
1466
1570
case REAL_RESULT:
1467
{ // It must REAL_RESULT
1468
double result= item->val_real();
1469
uint32_t length=item->max_length,decimals=item->decimals;
1470
bool null_value=item->null_value;
1471
new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
1472
new Item_float(name, result, decimals, length));
1571
{ // It must REAL_RESULT
1572
double result= item->val_real();
1573
uint32_t length=item->max_length,decimals=item->decimals;
1574
bool null_value=item->null_value;
1575
new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
1576
new Item_float(name, result, decimals, length));
1475
1579
case DECIMAL_RESULT:
1477
my_decimal decimal_value;
1478
my_decimal *result= item->val_decimal(&decimal_value);
1479
uint32_t length= item->max_length, decimals= item->decimals;
1480
bool null_value= item->null_value;
1481
new_item= (null_value ?
1482
(Item*) new Item_null(name) :
1483
(Item*) new Item_decimal(name, result, length, decimals));
1581
type::Decimal decimal_value;
1582
type::Decimal *result= item->val_decimal(&decimal_value);
1583
uint32_t length= item->max_length, decimals= item->decimals;
1584
bool null_value= item->null_value;
1585
new_item= (null_value ?
1586
(Item*) new Item_null(name) :
1587
(Item*) new Item_decimal(name, result, length, decimals));
1490
1593
session->change_item_tree(ref, new_item);
1504
1607
item_result=item->val_str(&item_tmp);
1505
1608
if (item->null_value)
1506
1609
return 1; // This must be true
1507
field->val_str(&field_tmp);
1508
return !stringcmp(&field_tmp,item_result);
1610
field->val_str_internal(&field_tmp);
1611
return not stringcmp(&field_tmp,item_result);
1510
1614
if (res_type == INT_RESULT)
1511
1615
return 1; // Both where of type int
1512
1617
if (res_type == DECIMAL_RESULT)
1514
my_decimal item_buf, *item_val,
1619
type::Decimal item_buf, *item_val,
1515
1620
field_buf, *field_val;
1516
1621
item_val= item->val_decimal(&item_buf);
1517
1622
if (item->null_value)
1518
1623
return 1; // This must be true
1519
1624
field_val= field->val_decimal(&field_buf);
1520
return !my_decimal_cmp(item_val, field_val);
1625
return !class_decimal_cmp(item_val, field_val);
1522
1628
double result= item->val_real();
1523
1629
if (item->null_value)
1525
1632
return result == field->val_real();
1557
1664
uint32_t convert_blob_length)
1559
1666
bool maybe_null= item->maybe_null;
1667
Field *new_field= NULL;
1562
1669
switch (item->result_type()) {
1563
1670
case REAL_RESULT:
1564
1671
new_field= new Field_double(item->max_length, maybe_null,
1565
1672
item->name, item->decimals, true);
1567
1675
case INT_RESULT:
1569
1677
Select an integer type with the minimal fit precision.
1570
1678
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
1571
1679
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
1572
Field_long : make them Field_int64_t.
1680
Int32 -> make them field::Int64.
1574
if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
1575
new_field=new Field_int64_t(item->max_length, maybe_null,
1576
item->name, item->unsigned_flag);
1682
if (item->unsigned_flag)
1684
new_field= new field::Size(item->max_length, maybe_null,
1685
item->name, item->unsigned_flag);
1687
else if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
1689
new_field= new field::Int64(item->max_length, maybe_null,
1690
item->name, item->unsigned_flag);
1578
new_field=new Field_long(item->max_length, maybe_null,
1579
item->name, item->unsigned_flag);
1694
new_field= new field::Int32(item->max_length, maybe_null,
1695
item->name, item->unsigned_flag);
1581
1700
case STRING_RESULT:
1582
1701
assert(item->collation.collation);
1611
1732
new_field->set_derivation(item->collation.derivation);
1613
1735
case DECIMAL_RESULT:
1615
uint8_t dec= item->decimals;
1616
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1617
uint32_t len= item->max_length;
1620
Trying to put too many digits overall in a DECIMAL(prec,dec)
1621
will always throw a warning. We must limit dec to
1622
DECIMAL_MAX_SCALE however to prevent an assert() later.
1627
signed int overflow;
1629
dec= min(dec, (uint8_t)DECIMAL_MAX_SCALE);
1737
uint8_t dec= item->decimals;
1738
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1739
uint32_t len= item->max_length;
1632
If the value still overflows the field with the corrected dec,
1633
we'll throw out decimals rather than integers. This is still
1634
bad and of course throws a truncation warning.
1635
+1: for decimal point
1742
Trying to put too many digits overall in a DECIMAL(prec,dec)
1743
will always throw a warning. We must limit dec to
1744
DECIMAL_MAX_SCALE however to prevent an assert() later.
1638
overflow= my_decimal_precision_to_length(intg + dec, dec,
1639
item->unsigned_flag) - len;
1642
dec= max(0, dec - overflow); // too long, discard fract
1644
len-= item->decimals - dec; // corrected value fits
1749
signed int overflow;
1751
dec= min(dec, (uint8_t)DECIMAL_MAX_SCALE);
1754
If the value still overflows the field with the corrected dec,
1755
we'll throw out decimals rather than integers. This is still
1756
bad and of course throws a truncation warning.
1757
+1: for decimal point
1760
overflow= class_decimal_precision_to_length(intg + dec, dec,
1761
item->unsigned_flag) - len;
1764
dec= max(0, dec - overflow); // too long, discard fract
1766
len-= item->decimals - dec; // corrected value fits
1769
new_field= new Field_decimal(len,
1773
item->unsigned_flag);
1647
new_field= new Field_decimal(len,
1651
item->unsigned_flag);
1654
1777
case ROW_RESULT:
1656
1778
// This case should never be choosen
1662
1784
new_field->init(table);
1664
1786
if (copy_func && item->is_result_field())
1665
1787
*((*copy_func)++) = item; // Save for copy_funcs
1666
1789
if (modify_item)
1667
1790
item->set_result_field(new_field);
1668
1792
if (item->type() == Item::NULL_ITEM)
1669
1793
new_field->is_created_from_null_item= true;
1670
1795
return new_field;
1899
std::ostream& operator<<(std::ostream& output, const Item &item)
1901
switch (item.type())
1903
case drizzled::Item::SUBSELECT_ITEM :
1904
case drizzled::Item::FIELD_ITEM :
1905
case drizzled::Item::SUM_FUNC_ITEM :
1906
case drizzled::Item::STRING_ITEM :
1907
case drizzled::Item::INT_ITEM :
1908
case drizzled::Item::REAL_ITEM :
1909
case drizzled::Item::NULL_ITEM :
1910
case drizzled::Item::VARBIN_ITEM :
1911
case drizzled::Item::COPY_STR_ITEM :
1912
case drizzled::Item::FIELD_AVG_ITEM :
1913
case drizzled::Item::DEFAULT_VALUE_ITEM :
1914
case drizzled::Item::PROC_ITEM :
1915
case drizzled::Item::COND_ITEM :
1916
case drizzled::Item::REF_ITEM :
1917
case drizzled::Item::FIELD_STD_ITEM :
1918
case drizzled::Item::FIELD_VARIANCE_ITEM :
1919
case drizzled::Item::INSERT_VALUE_ITEM :
1920
case drizzled::Item::ROW_ITEM:
1921
case drizzled::Item::CACHE_ITEM :
1922
case drizzled::Item::TYPE_HOLDER :
1923
case drizzled::Item::PARAM_ITEM :
1924
case drizzled::Item::DECIMAL_ITEM :
1925
case drizzled::Item::FUNC_ITEM :
1926
case drizzled::Item::BOOLEAN_ITEM :
1929
output << item.full_name();
1931
output << drizzled::display::type(item.type());
1937
return output; // for multiple << operators.
1772
1940
} /* namespace drizzled */