1176
1161
unsigned_flag);
1178
1163
case DRIZZLE_TYPE_LONG:
1179
field= new field::Int32((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1164
field= new Field_long((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1165
name, 0, unsigned_flag);
1181
1167
case DRIZZLE_TYPE_LONGLONG:
1182
field= new field::Int64((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1168
field= new Field_int64_t((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1169
name, 0, unsigned_flag);
1184
1171
case DRIZZLE_TYPE_DOUBLE:
1185
1172
field= new Field_double((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1186
name, decimals, 0, unsigned_flag);
1173
name, decimals, 0, unsigned_flag);
1188
1175
case DRIZZLE_TYPE_NULL:
1189
1176
field= new Field_null((unsigned char*) 0, max_length, name, &my_charset_bin);
1341
1333
enum_field_types f_type;
1343
1335
switch ((f_type=field_type())) {
1344
case DRIZZLE_TYPE_DATE:
1345
1337
case DRIZZLE_TYPE_NULL:
1346
1338
case DRIZZLE_TYPE_ENUM:
1347
1339
case DRIZZLE_TYPE_BLOB:
1348
1340
case DRIZZLE_TYPE_VARCHAR:
1349
case DRIZZLE_TYPE_UUID:
1350
1341
case DRIZZLE_TYPE_DECIMAL:
1353
if ((res=val_str(buffer)))
1354
result= client->store(res->ptr(),res->length());
1344
if ((res=val_str(buffer)))
1345
result= client->store(res->ptr(),res->length());
1357
1348
case DRIZZLE_TYPE_LONG:
1362
result= client->store((int32_t)nr);
1353
result= client->store((int32_t)nr);
1365
1356
case DRIZZLE_TYPE_LONGLONG:
1372
result= client->store((uint64_t)nr);
1374
result= client->store((int64_t)nr);
1363
result= client->store((uint64_t)nr);
1365
result= client->store((int64_t)nr);
1378
1369
case DRIZZLE_TYPE_DOUBLE:
1380
double nr= val_real();
1382
result= client->store(nr, decimals, buffer);
1371
double nr= val_real();
1373
result= client->store(nr, decimals, buffer);
1385
1376
case DRIZZLE_TYPE_DATETIME:
1386
1377
case DRIZZLE_TYPE_TIMESTAMP:
1389
get_date(&tm, TIME_FUZZY_DATE);
1391
result= client->store(&tm);
1380
get_date(&tm, TIME_FUZZY_DATE);
1382
result= client->store(&tm);
1395
1386
if (null_value)
1396
1387
result= client->store();
1428
1415
switch (res_type) {
1429
1416
case STRING_RESULT:
1418
char buff[MAX_FIELD_WIDTH];
1419
String tmp(buff,sizeof(buff),&my_charset_bin),*result;
1420
result=item->val_str(&tmp);
1421
if (item->null_value)
1422
new_item= new Item_null(name);
1431
char buff[MAX_FIELD_WIDTH];
1432
String tmp(buff,sizeof(buff),&my_charset_bin),*result;
1433
result=item->val_str(&tmp);
1434
if (item->null_value)
1435
new_item= new Item_null(name);
1438
uint32_t length= result->length();
1439
char *tmp_str= memory::sql_strmake(result->ptr(), length);
1440
new_item= new Item_string(name, tmp_str, length, result->charset());
1425
uint32_t length= result->length();
1426
char *tmp_str= memory::sql_strmake(result->ptr(), length);
1427
new_item= new Item_string(name, tmp_str, length, result->charset());
1444
1431
case INT_RESULT:
1446
int64_t result=item->val_int();
1447
uint32_t length=item->max_length;
1448
bool null_value=item->null_value;
1449
new_item= (null_value ? (Item*) new Item_null(name) :
1450
(Item*) new Item_int(name, result, length));
1433
int64_t result=item->val_int();
1434
uint32_t length=item->max_length;
1435
bool null_value=item->null_value;
1436
new_item= (null_value ? (Item*) new Item_null(name) :
1437
(Item*) new Item_int(name, result, length));
1453
1440
case ROW_RESULT:
1454
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
1457
Substitute constants only in Item_rows. Don't affect other Items
1458
with ROW_RESULT (eg Item_singlerow_subselect).
1441
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
1444
Substitute constants only in Item_rows. Don't affect other Items
1445
with ROW_RESULT (eg Item_singlerow_subselect).
1460
For such Items more optimal is to detect if it is constant and replace
1461
it with Item_row. This would optimize queries like this:
1462
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
1464
Item_row *item_row= (Item_row*) item;
1465
Item_row *comp_item_row= (Item_row*) comp_item;
1469
If item and comp_item are both Item_rows and have same number of cols
1470
then process items in Item_row one by one.
1471
We can't ignore NULL values here as this item may be used with <=>, in
1472
which case NULL's are significant.
1474
assert(item->result_type() == comp_item->result_type());
1475
assert(item_row->cols() == comp_item_row->cols());
1476
col= item_row->cols();
1478
resolve_const_item(session, item_row->addr(col),
1479
comp_item_row->element_index(col));
1447
For such Items more optimal is to detect if it is constant and replace
1448
it with Item_row. This would optimize queries like this:
1449
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
1451
Item_row *item_row= (Item_row*) item;
1452
Item_row *comp_item_row= (Item_row*) comp_item;
1456
If item and comp_item are both Item_rows and have same number of cols
1457
then process items in Item_row one by one.
1458
We can't ignore NULL values here as this item may be used with <=>, in
1459
which case NULL's are significant.
1461
assert(item->result_type() == comp_item->result_type());
1462
assert(item_row->cols() == comp_item_row->cols());
1463
col= item_row->cols();
1465
resolve_const_item(session, item_row->addr(col),
1466
comp_item_row->element_index(col));
1483
1470
case REAL_RESULT:
1484
{ // It must REAL_RESULT
1485
double result= item->val_real();
1486
uint32_t length=item->max_length,decimals=item->decimals;
1487
bool null_value=item->null_value;
1488
new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
1489
new Item_float(name, result, decimals, length));
1471
{ // It must REAL_RESULT
1472
double result= item->val_real();
1473
uint32_t length=item->max_length,decimals=item->decimals;
1474
bool null_value=item->null_value;
1475
new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
1476
new Item_float(name, result, decimals, length));
1492
1479
case DECIMAL_RESULT:
1494
my_decimal decimal_value;
1495
my_decimal *result= item->val_decimal(&decimal_value);
1496
uint32_t length= item->max_length, decimals= item->decimals;
1497
bool null_value= item->null_value;
1498
new_item= (null_value ?
1499
(Item*) new Item_null(name) :
1500
(Item*) new Item_decimal(name, result, length, decimals));
1481
my_decimal decimal_value;
1482
my_decimal *result= item->val_decimal(&decimal_value);
1483
uint32_t length= item->max_length, decimals= item->decimals;
1484
bool null_value= item->null_value;
1485
new_item= (null_value ?
1486
(Item*) new Item_null(name) :
1487
(Item*) new Item_decimal(name, result, length, decimals));
1506
1494
session->change_item_tree(ref, new_item);
1577
1561
uint32_t convert_blob_length)
1579
1563
bool maybe_null= item->maybe_null;
1580
Field *new_field= NULL;
1582
1566
switch (item->result_type()) {
1583
1567
case REAL_RESULT:
1584
1568
new_field= new Field_double(item->max_length, maybe_null,
1585
1569
item->name, item->decimals, true);
1588
1571
case INT_RESULT:
1590
1573
Select an integer type with the minimal fit precision.
1591
1574
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
1592
1575
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
1593
Int32 -> make them field::Int64.
1576
Field_long : make them Field_int64_t.
1595
1578
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);
1579
new_field=new Field_int64_t(item->max_length, maybe_null,
1580
item->name, item->unsigned_flag);
1599
new_field=new field::Int32(item->max_length, maybe_null,
1600
item->name, item->unsigned_flag);
1582
new_field=new Field_long(item->max_length, maybe_null,
1583
item->name, item->unsigned_flag);
1603
1585
case STRING_RESULT:
1604
1586
assert(item->collation.collation);
1633
1615
new_field->set_derivation(item->collation.derivation);
1636
1617
case DECIMAL_RESULT:
1619
uint8_t dec= item->decimals;
1620
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1621
uint32_t len= item->max_length;
1624
Trying to put too many digits overall in a DECIMAL(prec,dec)
1625
will always throw a warning. We must limit dec to
1626
DECIMAL_MAX_SCALE however to prevent an assert() later.
1638
uint8_t dec= item->decimals;
1639
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1640
uint32_t len= item->max_length;
1631
signed int overflow;
1633
dec= min(dec, (uint8_t)DECIMAL_MAX_SCALE);
1643
Trying to put too many digits overall in a DECIMAL(prec,dec)
1644
will always throw a warning. We must limit dec to
1645
DECIMAL_MAX_SCALE however to prevent an assert() later.
1636
If the value still overflows the field with the corrected dec,
1637
we'll throw out decimals rather than integers. This is still
1638
bad and of course throws a truncation warning.
1639
+1: for decimal point
1650
signed int overflow;
1652
dec= min(dec, (uint8_t)DECIMAL_MAX_SCALE);
1655
If the value still overflows the field with the corrected dec,
1656
we'll throw out decimals rather than integers. This is still
1657
bad and of course throws a truncation warning.
1658
+1: for decimal point
1661
overflow= my_decimal_precision_to_length(intg + dec, dec,
1662
item->unsigned_flag) - len;
1665
dec= max(0, dec - overflow); // too long, discard fract
1667
len-= item->decimals - dec; // corrected value fits
1670
new_field= new Field_decimal(len,
1674
item->unsigned_flag);
1642
overflow= my_decimal_precision_to_length(intg + dec, dec,
1643
item->unsigned_flag) - len;
1646
dec= max(0, dec - overflow); // too long, discard fract
1648
len-= item->decimals - dec; // corrected value fits
1651
new_field= new Field_decimal(len,
1655
item->unsigned_flag);
1678
1658
case ROW_RESULT:
1679
1660
// This case should never be choosen
1685
1666
new_field->init(table);
1687
1668
if (copy_func && item->is_result_field())
1688
1669
*((*copy_func)++) = item; // Save for copy_funcs
1690
1670
if (modify_item)
1691
1671
item->set_result_field(new_field);
1693
1672
if (item->type() == Item::NULL_ITEM)
1694
1673
new_field->is_created_from_null_item= true;
1696
1674
return new_field;