1176
1155
unsigned_flag);
1178
1157
case DRIZZLE_TYPE_LONG:
1179
field= new field::Int32((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1158
field= new Field_long((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1159
name, 0, unsigned_flag);
1181
1161
case DRIZZLE_TYPE_LONGLONG:
1182
field= new field::Int64((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE, name);
1162
field= new Field_int64_t((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1163
name, 0, unsigned_flag);
1184
1165
case DRIZZLE_TYPE_DOUBLE:
1185
1166
field= new Field_double((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
1186
name, decimals, 0, unsigned_flag);
1167
name, decimals, 0, unsigned_flag);
1188
1169
case DRIZZLE_TYPE_NULL:
1189
1170
field= new Field_null((unsigned char*) 0, max_length, name, &my_charset_bin);
1341
1327
enum_field_types f_type;
1343
1329
switch ((f_type=field_type())) {
1344
case DRIZZLE_TYPE_DATE:
1345
1331
case DRIZZLE_TYPE_NULL:
1346
1332
case DRIZZLE_TYPE_ENUM:
1347
1333
case DRIZZLE_TYPE_BLOB:
1348
1334
case DRIZZLE_TYPE_VARCHAR:
1349
case DRIZZLE_TYPE_UUID:
1350
1335
case DRIZZLE_TYPE_DECIMAL:
1353
if ((res=val_str(buffer)))
1354
result= client->store(res->ptr(),res->length());
1338
if ((res=val_str(buffer)))
1339
result= client->store(res->ptr(),res->length());
1357
1342
case DRIZZLE_TYPE_LONG:
1362
result= client->store((int32_t)nr);
1347
result= client->store((int32_t)nr);
1365
1350
case DRIZZLE_TYPE_LONGLONG:
1372
result= client->store((uint64_t)nr);
1374
result= client->store((int64_t)nr);
1357
result= client->store((uint64_t)nr);
1359
result= client->store((int64_t)nr);
1378
1363
case DRIZZLE_TYPE_DOUBLE:
1380
double nr= val_real();
1382
result= client->store(nr, decimals, buffer);
1365
double nr= val_real();
1367
result= client->store(nr, decimals, buffer);
1385
1370
case DRIZZLE_TYPE_DATETIME:
1386
1371
case DRIZZLE_TYPE_TIMESTAMP:
1389
get_date(&tm, TIME_FUZZY_DATE);
1391
result= client->store(&tm);
1374
get_date(&tm, TIME_FUZZY_DATE);
1376
result= client->store(&tm);
1395
1380
if (null_value)
1396
1381
result= client->store();
1428
1409
switch (res_type) {
1429
1410
case STRING_RESULT:
1412
char buff[MAX_FIELD_WIDTH];
1413
String tmp(buff,sizeof(buff),&my_charset_bin),*result;
1414
result=item->val_str(&tmp);
1415
if (item->null_value)
1416
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());
1419
uint32_t length= result->length();
1420
char *tmp_str= memory::sql_strmake(result->ptr(), length);
1421
new_item= new Item_string(name, tmp_str, length, result->charset());
1444
1425
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));
1427
int64_t result=item->val_int();
1428
uint32_t length=item->max_length;
1429
bool null_value=item->null_value;
1430
new_item= (null_value ? (Item*) new Item_null(name) :
1431
(Item*) new Item_int(name, result, length));
1453
1434
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).
1435
if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
1438
Substitute constants only in Item_rows. Don't affect other Items
1439
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));
1441
For such Items more optimal is to detect if it is constant and replace
1442
it with Item_row. This would optimize queries like this:
1443
SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
1445
Item_row *item_row= (Item_row*) item;
1446
Item_row *comp_item_row= (Item_row*) comp_item;
1450
If item and comp_item are both Item_rows and have same number of cols
1451
then process items in Item_row one by one.
1452
We can't ignore NULL values here as this item may be used with <=>, in
1453
which case NULL's are significant.
1455
assert(item->result_type() == comp_item->result_type());
1456
assert(item_row->cols() == comp_item_row->cols());
1457
col= item_row->cols();
1459
resolve_const_item(session, item_row->addr(col),
1460
comp_item_row->element_index(col));
1483
1464
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));
1465
{ // It must REAL_RESULT
1466
double result= item->val_real();
1467
uint32_t length=item->max_length,decimals=item->decimals;
1468
bool null_value=item->null_value;
1469
new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
1470
new Item_float(name, result, decimals, length));
1492
1473
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));
1475
my_decimal decimal_value;
1476
my_decimal *result= item->val_decimal(&decimal_value);
1477
uint32_t length= item->max_length, decimals= item->decimals;
1478
bool null_value= item->null_value;
1479
new_item= (null_value ?
1480
(Item*) new Item_null(name) :
1481
(Item*) new Item_decimal(name, result, length, decimals));
1506
1488
session->change_item_tree(ref, new_item);
1577
1555
uint32_t convert_blob_length)
1579
1557
bool maybe_null= item->maybe_null;
1580
Field *new_field= NULL;
1582
1560
switch (item->result_type()) {
1583
1561
case REAL_RESULT:
1584
1562
new_field= new Field_double(item->max_length, maybe_null,
1585
1563
item->name, item->decimals, true);
1588
1565
case INT_RESULT:
1590
1567
Select an integer type with the minimal fit precision.
1591
1568
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
1592
1569
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
1593
Int32 -> make them field::Int64.
1570
Field_long : make them Field_int64_t.
1595
1572
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);
1573
new_field=new Field_int64_t(item->max_length, maybe_null,
1574
item->name, item->unsigned_flag);
1599
new_field=new field::Int32(item->max_length, maybe_null,
1600
item->name, item->unsigned_flag);
1576
new_field=new Field_long(item->max_length, maybe_null,
1577
item->name, item->unsigned_flag);
1603
1579
case STRING_RESULT:
1604
1580
assert(item->collation.collation);
1611
1587
if ((type= item->field_type()) == DRIZZLE_TYPE_DATETIME ||
1612
1588
type == DRIZZLE_TYPE_DATE ||
1613
1589
type == DRIZZLE_TYPE_TIMESTAMP)
1615
1590
new_field= item->tmp_table_field_from_field_type(table, 1);
1617
Make sure that the blob fits into a Field_varstring which has
1592
Make sure that the blob fits into a Field_varstring which has
1621
1595
else if (item->max_length/item->collation.collation->mbmaxlen > 255 &&
1622
1596
convert_blob_length <= Field_varstring::MAX_SIZE &&
1623
1597
convert_blob_length)
1625
table->setVariableWidth();
1626
1598
new_field= new Field_varstring(convert_blob_length, maybe_null,
1627
item->name, item->collation.collation);
1599
item->name, table->getMutableShare(),
1600
item->collation.collation);
1631
1602
new_field= item->make_string_field(table);
1633
1603
new_field->set_derivation(item->collation.derivation);
1636
1605
case DECIMAL_RESULT:
1607
uint8_t dec= item->decimals;
1608
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
1609
uint32_t len= item->max_length;
1612
Trying to put too many digits overall in a DECIMAL(prec,dec)
1613
will always throw a warning. We must limit dec to
1614
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;
1619
signed int overflow;
1621
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.
1624
If the value still overflows the field with the corrected dec,
1625
we'll throw out decimals rather than integers. This is still
1626
bad and of course throws a truncation warning.
1627
+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);
1630
overflow= my_decimal_precision_to_length(intg + dec, dec,
1631
item->unsigned_flag) - len;
1634
dec= max(0, dec - overflow); // too long, discard fract
1636
len-= item->decimals - dec; // corrected value fits
1639
new_field= new Field_decimal(len,
1643
item->unsigned_flag);
1678
1646
case ROW_RESULT:
1679
1648
// This case should never be choosen
1685
1654
new_field->init(table);
1687
1656
if (copy_func && item->is_result_field())
1688
1657
*((*copy_func)++) = item; // Save for copy_funcs
1690
1658
if (modify_item)
1691
1659
item->set_result_field(new_field);
1693
1660
if (item->type() == Item::NULL_ITEM)
1694
1661
new_field->is_created_from_null_item= true;
1696
1662
return new_field;