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
1329
enum_field_types f_type;
1343
1331
switch ((f_type=field_type())) {
1344
case DRIZZLE_TYPE_DATE:
1345
1333
case DRIZZLE_TYPE_NULL:
1346
1334
case DRIZZLE_TYPE_ENUM:
1347
1335
case DRIZZLE_TYPE_BLOB:
1348
1336
case DRIZZLE_TYPE_VARCHAR:
1349
case DRIZZLE_TYPE_UUID:
1350
1337
case DRIZZLE_TYPE_DECIMAL:
1353
if ((res=val_str(buffer)))
1354
result= client->store(res->ptr(),res->length());
1340
if ((res=val_str(buffer)))
1341
result= client->store(res->ptr(),res->length());
1357
1344
case DRIZZLE_TYPE_LONG:
1362
result= client->store((int32_t)nr);
1349
result= client->store((int32_t)nr);
1365
1352
case DRIZZLE_TYPE_LONGLONG:
1372
result= client->store((uint64_t)nr);
1374
result= client->store((int64_t)nr);
1359
result= client->store((uint64_t)nr);
1361
result= client->store((int64_t)nr);
1378
1365
case DRIZZLE_TYPE_DOUBLE:
1380
double nr= val_real();
1382
result= client->store(nr, decimals, buffer);
1367
double nr= val_real();
1369
result= client->store(nr, decimals, buffer);
1385
1372
case DRIZZLE_TYPE_DATETIME:
1386
1373
case DRIZZLE_TYPE_TIMESTAMP:
1389
get_date(&tm, TIME_FUZZY_DATE);
1391
result= client->store(&tm);
1376
get_date(&tm, TIME_FUZZY_DATE);
1378
result= client->store(&tm);
1395
1382
if (null_value)
1396
1383
result= client->store();
1428
1411
switch (res_type) {
1429
1412
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);
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());
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());
1444
1427
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));
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));
1453
1436
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).
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).
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));
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));
1483
1466
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));
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));
1492
1475
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));
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));
1506
1490
session->change_item_tree(ref, new_item);
1577
1557
uint32_t convert_blob_length)
1579
1559
bool maybe_null= item->maybe_null;
1580
Field *new_field= NULL;
1582
1562
switch (item->result_type()) {
1583
1563
case REAL_RESULT:
1584
1564
new_field= new Field_double(item->max_length, maybe_null,
1585
1565
item->name, item->decimals, true);
1588
1567
case INT_RESULT:
1590
1569
Select an integer type with the minimal fit precision.
1591
1570
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
1592
1571
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
1593
Int32 -> make them field::Int64.
1572
Field_long : make them Field_int64_t.
1595
1574
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);
1575
new_field=new Field_int64_t(item->max_length, maybe_null,
1576
item->name, item->unsigned_flag);
1599
new_field=new field::Int32(item->max_length, maybe_null,
1600
item->name, item->unsigned_flag);
1578
new_field=new Field_long(item->max_length, maybe_null,
1579
item->name, item->unsigned_flag);
1603
1581
case STRING_RESULT:
1604
1582
assert(item->collation.collation);
1633
1611
new_field->set_derivation(item->collation.derivation);
1636
1613
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.
1638
uint8_t dec= item->decimals;
1639
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1640
uint32_t len= item->max_length;
1627
signed int overflow;
1629
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.
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
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);
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
1647
new_field= new Field_decimal(len,
1651
item->unsigned_flag);
1678
1654
case ROW_RESULT:
1679
1656
// This case should never be choosen
1685
1662
new_field->init(table);
1687
1664
if (copy_func && item->is_result_field())
1688
1665
*((*copy_func)++) = item; // Save for copy_funcs
1690
1666
if (modify_item)
1691
1667
item->set_result_field(new_field);
1693
1668
if (item->type() == Item::NULL_ITEM)
1694
1669
new_field->is_created_from_null_item= true;
1696
1670
return new_field;