397
531
//DRIZZLE_TYPE_LONGLONG
399
535
//DRIZZLE_TYPE_DATETIME
401
537
//DRIZZLE_TYPE_DATE
403
539
//DRIZZLE_TYPE_VARCHAR
405
//DRIZZLE_TYPE_DECIMAL
541
//DRIZZLE_TYPE_VIRTUAL
543
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
544
DECIMAL_RESULT, STRING_RESULT,
409
545
//DRIZZLE_TYPE_BLOB
415
bool test_if_important_data(const CHARSET_INFO * const cs,
551
Test if the given string contains important data:
552
not spaces for character string,
553
or any data for binary string.
556
test_if_important_data()
562
false - If string does not have important data
563
true - If string has some important data
567
test_if_important_data(const CHARSET_INFO * const cs, const char *str,
419
570
if (cs != &my_charset_bin)
420
571
str+= cs->cset->scan(cs, str, strend, MY_SEQ_SPACES);
421
572
return (str < strend);
424
void *Field::operator new(size_t size)
426
return memory::sql_alloc(size);
429
void *Field::operator new(size_t size, memory::Root *mem_root)
431
return mem_root->alloc_root(static_cast<uint32_t>(size));
434
enum_field_types Field::field_type_merge(enum_field_types a,
437
assert(a < enum_field_types_size);
438
assert(b < enum_field_types_size);
439
return field_types_merge_rules[a][b];
442
576
Item_result Field::result_merge_type(enum_field_types field_type)
444
assert(field_type < enum_field_types_size);
578
assert(field_type <= DRIZZLE_TYPE_MAX);
445
579
return field_types_result_type[field_type];
448
583
bool Field::eq(Field *field)
450
585
return (ptr == field->ptr && null_ptr == field->null_ptr &&
451
586
null_bit == field->null_bit);
454
590
uint32_t Field::pack_length() const
456
592
return field_length;
459
596
uint32_t Field::pack_length_in_rec() const
461
598
return pack_length();
602
uint32_t Field::pack_length_from_metadata(uint32_t field_metadata)
604
return field_metadata;
608
uint32_t Field::row_pack_length()
614
int Field::save_field_metadata(unsigned char *first_byte)
616
return do_save_field_metadata(first_byte);
464
620
uint32_t Field::data_length()
466
622
return pack_length();
469
626
uint32_t Field::used_length()
471
628
return pack_length();
474
632
uint32_t Field::sort_length() const
476
634
return pack_length();
479
638
uint32_t Field::max_data_length() const
481
640
return pack_length();
484
644
int Field::reset(void)
486
646
memset(ptr, 0, pack_length());
490
651
void Field::reset_fields()
493
655
void Field::set_default()
495
ptrdiff_t l_offset= (ptrdiff_t) (table->getDefaultValues() - table->getInsertRecord());
657
my_ptrdiff_t l_offset= (my_ptrdiff_t) (table->getDefaultValues() - table->record[0]);
496
658
memcpy(ptr, ptr + l_offset, pack_length());
498
660
*null_ptr= ((*null_ptr & (unsigned char) ~null_bit) | (null_ptr[l_offset] & null_bit));
500
if (this == table->next_number_field)
501
table->auto_increment_field_not_null= false;
504
664
bool Field::binary() const
509
670
bool Field::zero_pack() const
514
676
enum ha_base_keytype Field::key_type() const
516
678
return HA_KEYTYPE_BINARY;
519
682
uint32_t Field::key_length() const
521
684
return pack_length();
524
688
enum_field_types Field::real_type() const
529
694
int Field::cmp_max(const unsigned char *a, const unsigned char *b, uint32_t)
531
696
return cmp(a, b);
534
700
int Field::cmp_binary(const unsigned char *a,const unsigned char *b, uint32_t)
536
702
return memcmp(a,b,pack_length());
539
706
int Field::cmp_offset(uint32_t row_offset)
541
708
return cmp(ptr,ptr+row_offset);
544
712
int Field::cmp_binary_offset(uint32_t row_offset)
546
714
return cmp_binary(ptr, ptr+row_offset);
549
718
int Field::key_cmp(const unsigned char *a,const unsigned char *b)
551
720
return cmp(a, b);
554
724
int Field::key_cmp(const unsigned char *str, uint32_t)
556
726
return cmp(ptr,str);
559
730
uint32_t Field::decimals() const
564
bool Field::is_null(ptrdiff_t row_offset)
736
bool Field::is_null(my_ptrdiff_t row_offset)
566
738
return null_ptr ?
567
739
(null_ptr[row_offset] & null_bit ? true : false) :
571
bool Field::is_real_null(ptrdiff_t row_offset)
744
bool Field::is_real_null(my_ptrdiff_t row_offset)
573
746
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : false;
576
750
bool Field::is_null_in_record(const unsigned char *record)
580
return test(record[(uint32_t) (null_ptr -table->getInsertRecord())] & null_bit);
754
return test(record[(uint32_t) (null_ptr -table->record[0])] &
583
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset)
759
bool Field::is_null_in_record_with_offset(my_ptrdiff_t offset)
587
return test(null_ptr[with_offset] & null_bit);
763
return test(null_ptr[offset] & null_bit);
590
void Field::set_null(ptrdiff_t row_offset)
767
void Field::set_null(my_ptrdiff_t row_offset)
593
770
null_ptr[row_offset]|= null_bit;
596
void Field::set_notnull(ptrdiff_t row_offset)
774
void Field::set_notnull(my_ptrdiff_t row_offset)
599
777
null_ptr[row_offset]&= (unsigned char) ~null_bit;
602
781
bool Field::maybe_null(void)
604
783
return null_ptr != 0 || table->maybe_null;
607
787
bool Field::real_maybe_null(void)
609
789
return null_ptr != 0;
793
size_t Field::last_null_byte() const
795
size_t bytes= do_last_null_byte();
796
assert(bytes <= table->getNullBytes());
801
/*****************************************************************************
802
Static help functions
803
*****************************************************************************/
612
805
bool Field::type_can_have_key_part(enum enum_field_types type)
818
Process decimal library return codes and issue warnings for overflow and
821
@param op_result decimal library return code (E_DEC_* see include/decimal.h)
826
0 no error or some other errors except overflow
623
829
int Field::warn_if_overflow(int op_result)
625
831
if (op_result == E_DEC_OVERFLOW)
627
833
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
628
return E_DEC_OVERFLOW;
630
836
if (op_result == E_DEC_TRUNCATED)
632
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
633
return E_DEC_TRUNCATED;
838
set_warning(DRIZZLE_ERROR::WARN_LEVEL_NOTE, ER_WARN_DATA_TRUNCATED, 1);
839
/* We return 0 here as this is not a critical issue */
638
845
void Field::init(Table *table_arg)
640
847
orig_table= table= table_arg;
848
table_name= &table_arg->alias;
853
static bool test_if_real(const char *str,int length, const CHARSET_INFO * const cs)
855
cs= system_charset_info; // QQ move test_if_real into CHARSET_INFO struct
857
while (length && my_isspace(cs,*str))
858
{ // Allow start space
863
if (*str == '+' || *str == '-')
866
if (!length || !(my_isdigit(cs,*str) || *str == '.'))
869
while (length && my_isdigit(cs,*str))
878
while (length && my_isdigit(cs,*str))
885
if (*str == 'E' || *str == 'e')
887
if (length < 3 || (str[1] != '+' && str[1] != '-') ||
888
!my_isdigit(cs,str[2]))
892
while (length && my_isdigit(cs,*str))
897
for (; length ; length--, str++)
899
if (!my_isspace(cs,*str))
908
Interpret field value as an integer but return the result as a string.
910
This is used for printing bit_fields as numbers while debugging.
913
String *Field::val_int_as_str(String *val_buffer, bool unsigned_val)
915
const CHARSET_INFO * const cs= &my_charset_bin;
917
int64_t value= val_int();
919
if (val_buffer->alloc(MY_INT64_NUM_DECIMAL_DIGITS))
921
length= (uint32_t) (*cs->cset->int64_t10_to_str)(cs, (char*) val_buffer->ptr(),
922
MY_INT64_NUM_DECIMAL_DIGITS,
923
unsigned_val ? 10 : -10,
925
val_buffer->length(length);
643
930
/// This is used as a table name when the table structure is not set up
644
Field::Field(unsigned char *ptr_arg,
646
unsigned char *null_ptr_arg,
931
Field::Field(unsigned char *ptr_arg,uint32_t length_arg,unsigned char *null_ptr_arg,
647
932
unsigned char null_bit_arg,
648
utype unireg_check_arg,
649
const char *field_name_arg)
652
null_ptr(null_ptr_arg),
655
field_name(field_name_arg),
658
part_of_key_not_clustered(0),
660
unireg_check(unireg_check_arg),
661
field_length(length_arg),
662
null_bit(null_bit_arg),
663
is_created_from_null_item(false)
933
utype unireg_check_arg, const char *field_name_arg)
934
:ptr(ptr_arg), null_ptr(null_ptr_arg),
935
table(0), orig_table(0), table_name(0),
936
field_name(field_name_arg),
937
key_start(0), part_of_key(0), part_of_key_not_clustered(0),
938
part_of_sortkey(0), unireg_check(unireg_check_arg),
939
field_length(length_arg), null_bit(null_bit_arg),
940
is_created_from_null_item(false),
941
vcol_info(NULL), is_stored(true)
665
flags= null_ptr ? 0: NOT_NULL_FLAG;
943
flags=null_ptr ? 0: NOT_NULL_FLAG;
666
944
comment.str= (char*) "";
671
950
void Field::hash(uint32_t *nr, uint32_t *nr2)
1391
/*****************************************************************************
1392
Handling of field and Create_field
1393
*****************************************************************************/
1396
Convert create_field::length from number of characters to number of bytes.
1399
void Create_field::create_length_to_internal_length(void)
1402
case DRIZZLE_TYPE_BLOB:
1403
case DRIZZLE_TYPE_VARCHAR:
1404
length*= charset->mbmaxlen;
1406
pack_length= calc_pack_length(sql_type, length);
1408
case DRIZZLE_TYPE_ENUM:
1409
/* Pack_length already calculated in sql_parse.cc */
1410
length*= charset->mbmaxlen;
1411
key_length= pack_length;
1413
case DRIZZLE_TYPE_NEWDECIMAL:
1414
key_length= pack_length=
1415
my_decimal_get_binary_size(my_decimal_length_to_precision(length,
1422
key_length= pack_length= calc_pack_length(sql_type, length);
1429
Init for a tmp table field. To be extended if need be.
1431
void Create_field::init_for_tmp_table(enum_field_types sql_type_arg,
1432
uint32_t length_arg, uint32_t decimals_arg,
1433
bool maybe_null, bool is_unsigned)
1436
sql_type= sql_type_arg;
1437
char_length= length= length_arg;;
1438
unireg_check= Field::NONE;
1440
charset= &my_charset_bin;
1441
pack_flag= (FIELDFLAG_NUMBER |
1442
((decimals_arg & FIELDFLAG_MAX_DEC) << FIELDFLAG_DEC_SHIFT) |
1443
(maybe_null ? FIELDFLAG_MAYBE_NULL : 0) |
1444
(is_unsigned ? 0 : FIELDFLAG_DECIMAL));
1451
Initialize field definition for create.
1453
@param session Thread handle
1454
@param fld_name Field name
1455
@param fld_type Field type
1456
@param fld_length Field length
1457
@param fld_decimals Decimal (if any)
1458
@param fld_type_modifier Additional type information
1459
@param fld_default_value Field default value (if any)
1460
@param fld_on_update_value The value of ON UPDATE clause
1461
@param fld_comment Field comment
1462
@param fld_change Field change
1463
@param fld_interval_list Interval list (if any)
1464
@param fld_charset Field charset
1465
@param fld_vcol_info Virtual column data
1473
bool Create_field::init(Session *, char *fld_name, enum_field_types fld_type,
1474
char *fld_length, char *fld_decimals,
1475
uint32_t fld_type_modifier, Item *fld_default_value,
1476
Item *fld_on_update_value, LEX_STRING *fld_comment,
1477
char *fld_change, List<String> *fld_interval_list,
1478
const CHARSET_INFO * const fld_charset,
1479
uint32_t, enum column_format_type column_format,
1480
virtual_column_info *fld_vcol_info)
1482
uint32_t sign_len, allowed_type_modifier= 0;
1483
uint32_t max_field_charlength= MAX_FIELD_CHARLENGTH;
1486
field_name= fld_name;
1487
def= fld_default_value;
1488
flags= fld_type_modifier;
1489
flags|= (((uint32_t)column_format & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
1490
unireg_check= (fld_type_modifier & AUTO_INCREMENT_FLAG ?
1491
Field::NEXT_NUMBER : Field::NONE);
1492
decimals= fld_decimals ? (uint32_t)atoi(fld_decimals) : 0;
1493
if (decimals >= NOT_FIXED_DEC)
1495
my_error(ER_TOO_BIG_SCALE, MYF(0), decimals, fld_name,
1504
pack_length= key_length= 0;
1505
charset= fld_charset;
1506
interval_list.empty();
1508
comment= *fld_comment;
1509
vcol_info= fld_vcol_info;
1512
/* Initialize data for a virtual field */
1513
if (fld_type == DRIZZLE_TYPE_VIRTUAL)
1515
assert(vcol_info && vcol_info->expr_item);
1516
is_stored= vcol_info->get_field_stored();
1518
Perform per item-type checks to determine if the expression is
1519
allowed for a virtual column.
1520
Note that validation of the specific function is done later in
1521
procedures open_table_from_share and fix_fields_vcol_func
1523
switch (vcol_info->expr_item->type()) {
1524
case Item::FUNC_ITEM:
1525
if (((Item_func *)vcol_info->expr_item)->functype() == Item_func::FUNC_SP)
1527
my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(0), field_name);
1531
case Item::COPY_STR_ITEM:
1532
case Item::FIELD_AVG_ITEM:
1533
case Item::PROC_ITEM:
1534
case Item::REF_ITEM:
1535
case Item::FIELD_STD_ITEM:
1536
case Item::FIELD_VARIANCE_ITEM:
1537
case Item::INSERT_VALUE_ITEM:
1538
case Item::SUBSELECT_ITEM:
1539
case Item::CACHE_ITEM:
1540
case Item::TYPE_HOLDER:
1541
case Item::PARAM_ITEM:
1542
my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(0), field_name);
1546
// Continue with the field creation
1550
Make a field created for the real type.
1551
Note that "real" and virtual fields differ from each other
1552
only by Field::vcol_info, which is always 0 for normal columns.
1553
vcol_info is updated for fields later in procedure open_binary_frm.
1555
sql_type= fld_type= vcol_info->get_real_type();
1559
Set NO_DEFAULT_VALUE_FLAG if this field doesn't have a default value and
1560
it is NOT NULL, not an AUTO_INCREMENT field and not a TIMESTAMP.
1562
if (!fld_default_value && !(fld_type_modifier & AUTO_INCREMENT_FLAG) &&
1563
(fld_type_modifier & NOT_NULL_FLAG) && fld_type != DRIZZLE_TYPE_TIMESTAMP)
1564
flags|= NO_DEFAULT_VALUE_FLAG;
1566
if (fld_length && !(length= (uint32_t) atoi(fld_length)))
1567
fld_length= 0; /* purecov: inspected */
1568
sign_len= fld_type_modifier & UNSIGNED_FLAG ? 0 : 1;
1571
case DRIZZLE_TYPE_TINY:
1573
length= MAX_TINYINT_WIDTH+sign_len;
1574
allowed_type_modifier= AUTO_INCREMENT_FLAG;
1576
case DRIZZLE_TYPE_LONG:
1578
length= MAX_INT_WIDTH+sign_len;
1579
allowed_type_modifier= AUTO_INCREMENT_FLAG;
1581
case DRIZZLE_TYPE_LONGLONG:
1583
length= MAX_BIGINT_WIDTH;
1584
allowed_type_modifier= AUTO_INCREMENT_FLAG;
1586
case DRIZZLE_TYPE_NULL:
1588
case DRIZZLE_TYPE_NEWDECIMAL:
1589
my_decimal_trim(&length, &decimals);
1590
if (length > DECIMAL_MAX_PRECISION)
1592
my_error(ER_TOO_BIG_PRECISION, MYF(0), length, fld_name,
1593
DECIMAL_MAX_PRECISION);
1596
if (length < decimals)
1598
my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
1602
my_decimal_precision_to_length(length, decimals,
1603
fld_type_modifier & UNSIGNED_FLAG);
1605
my_decimal_get_binary_size(length, decimals);
1607
case DRIZZLE_TYPE_VARCHAR:
1609
Long VARCHAR's are automaticly converted to blobs in mysql_prepare_table
1610
if they don't have a default value
1612
max_field_charlength= MAX_FIELD_VARCHARLENGTH;
1614
case DRIZZLE_TYPE_BLOB:
1615
if (fld_default_value)
1617
/* Allow empty as default value. */
1619
res= fld_default_value->val_str(&str);
1623
case DRIZZLE_TYPE_DOUBLE:
1624
allowed_type_modifier= AUTO_INCREMENT_FLAG;
1625
if (!fld_length && !fld_decimals)
1628
decimals= NOT_FIXED_DEC;
1630
if (length < decimals &&
1631
decimals != NOT_FIXED_DEC)
1633
my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
1637
case DRIZZLE_TYPE_TIMESTAMP:
1640
/* Compressed date YYYYMMDDHHMMSS */
1641
length= MAX_DATETIME_COMPRESSED_WIDTH;
1643
else if (length != MAX_DATETIME_WIDTH)
1646
We support only even TIMESTAMP lengths less or equal than 14
1647
and 19 as length of 4.1 compatible representation.
1649
length= ((length+1)/2)*2; /* purecov: inspected */
1650
length= cmin(length, (uint32_t)MAX_DATETIME_COMPRESSED_WIDTH); /* purecov: inspected */
1652
flags|= UNSIGNED_FLAG;
1653
if (fld_default_value)
1655
/* Grammar allows only NOW() value for ON UPDATE clause */
1656
if (fld_default_value->type() == Item::FUNC_ITEM &&
1657
((Item_func*)fld_default_value)->functype() == Item_func::NOW_FUNC)
1659
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_DNUN_FIELD:
1660
Field::TIMESTAMP_DN_FIELD);
1662
We don't need default value any longer moreover it is dangerous.
1663
Everything handled by unireg_check further.
1668
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_UN_FIELD:
1674
If we have default TIMESTAMP NOT NULL column without explicit DEFAULT
1675
or ON UPDATE values then for the sake of compatiblity we should treat
1676
this column as having DEFAULT NOW() ON UPDATE NOW() (when we don't
1677
have another TIMESTAMP column with auto-set option before this one)
1678
or DEFAULT 0 (in other cases).
1679
So here we are setting TIMESTAMP_OLD_FIELD only temporary, and will
1680
replace this value by TIMESTAMP_DNUN_FIELD or NONE later when
1681
information about all TIMESTAMP fields in table will be availiable.
1683
If we have TIMESTAMP NULL column without explicit DEFAULT value
1684
we treat it as having DEFAULT NULL attribute.
1686
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_UN_FIELD :
1687
(flags & NOT_NULL_FLAG ? Field::TIMESTAMP_OLD_FIELD :
1691
case DRIZZLE_TYPE_DATE:
1694
case DRIZZLE_TYPE_TIME:
1697
case DRIZZLE_TYPE_DATETIME:
1698
length= MAX_DATETIME_WIDTH;
1700
case DRIZZLE_TYPE_ENUM:
1702
/* Should be safe. */
1703
pack_length= get_enum_pack_length(fld_interval_list->elements);
1705
List_iterator<String> it(*fld_interval_list);
1708
interval_list.push_back(tmp);
1709
length= 1; /* See comment for DRIZZLE_TYPE_SET above. */
1712
case DRIZZLE_TYPE_VIRTUAL: // Must not happen
1715
/* Remember the value of length */
1716
char_length= length;
1718
if (!(flags & BLOB_FLAG) &&
1719
((length > max_field_charlength &&
1720
fld_type != DRIZZLE_TYPE_ENUM &&
1721
(fld_type != DRIZZLE_TYPE_VARCHAR || fld_default_value)) ||
1722
(!length && fld_type != DRIZZLE_TYPE_VARCHAR)))
1724
my_error((fld_type == DRIZZLE_TYPE_VARCHAR) ? ER_TOO_BIG_FIELDLENGTH : ER_TOO_BIG_DISPLAYWIDTH,
1726
fld_name, max_field_charlength); /* purecov: inspected */
1729
fld_type_modifier&= AUTO_INCREMENT_FLAG;
1730
if ((~allowed_type_modifier) & fld_type_modifier)
1732
my_error(ER_WRONG_FIELD_SPEC, MYF(0), fld_name);
1736
return(false); /* success */
1740
enum_field_types get_blob_type_from_length(uint32_t)
1742
enum_field_types type;
1744
type= DRIZZLE_TYPE_BLOB;
1751
Make a field from the .frm file info
947
1754
uint32_t calc_pack_length(enum_field_types type,uint32_t length)
950
case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
951
case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
1757
case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
1758
case DRIZZLE_TYPE_TINY : return 1;
952
1759
case DRIZZLE_TYPE_DATE:
953
case DRIZZLE_TYPE_ENUM:
954
case DRIZZLE_TYPE_LONG: return 4;
1760
case DRIZZLE_TYPE_TIME: return 3;
1761
case DRIZZLE_TYPE_TIMESTAMP:
1762
case DRIZZLE_TYPE_LONG : return 4;
955
1763
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
956
1764
case DRIZZLE_TYPE_DATETIME:
957
case DRIZZLE_TYPE_TIMESTAMP:
958
1765
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
959
case DRIZZLE_TYPE_NULL: return 0;
960
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
961
case DRIZZLE_TYPE_DECIMAL:
1766
case DRIZZLE_TYPE_NULL : return 0;
1767
case DRIZZLE_TYPE_BLOB: return 4+portable_sizeof_char_ptr;
1768
case DRIZZLE_TYPE_ENUM:
1769
case DRIZZLE_TYPE_NEWDECIMAL:
1770
abort(); return 0; // This shouldn't happen
970
1777
uint32_t pack_length_to_packflag(uint32_t type)
973
1780
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
974
1781
case 2: assert(1);
975
1782
case 3: assert(1);
976
case 4: return f_settype(DRIZZLE_TYPE_LONG);
977
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
1783
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
1784
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
979
1786
return 0; // This shouldn't happen
1790
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
1791
unsigned char *null_pos, unsigned char null_bit,
1793
enum_field_types field_type,
1794
const CHARSET_INFO * field_charset,
1795
Field::utype unireg_check,
1797
const char *field_name)
1799
if (!f_maybe_null(pack_flag))
1806
null_bit= ((unsigned char) 1) << null_bit;
1809
switch (field_type) {
1810
case DRIZZLE_TYPE_DATE:
1811
case DRIZZLE_TYPE_TIME:
1812
case DRIZZLE_TYPE_DATETIME:
1813
case DRIZZLE_TYPE_TIMESTAMP:
1814
field_charset= &my_charset_bin;
1818
if (f_is_alpha(pack_flag))
1820
if (!f_is_packed(pack_flag))
1822
if (field_type == DRIZZLE_TYPE_VARCHAR)
1823
return new Field_varstring(ptr,field_length,
1824
HA_VARCHAR_PACKLENGTH(field_length),
1826
unireg_check, field_name,
1832
uint32_t pack_length=calc_pack_length((enum_field_types)
1833
f_packtype(pack_flag),
1836
if (f_is_blob(pack_flag))
1837
return new Field_blob(ptr,null_pos,null_bit,
1838
unireg_check, field_name, share,
1839
pack_length, field_charset);
1842
if (f_is_enum(pack_flag))
1844
return new Field_enum(ptr,field_length,null_pos,null_bit,
1845
unireg_check, field_name,
1846
get_enum_pack_length(interval->count),
1847
interval, field_charset);
1852
switch (field_type) {
1853
case DRIZZLE_TYPE_NEWDECIMAL:
1854
return new Field_new_decimal(ptr,field_length,null_pos,null_bit,
1855
unireg_check, field_name,
1856
f_decimals(pack_flag),
1857
f_is_decimal_precision(pack_flag) != 0,
1858
f_is_dec(pack_flag) == 0);
1859
case DRIZZLE_TYPE_DOUBLE:
1860
return new Field_double(ptr,field_length,null_pos,null_bit,
1861
unireg_check, field_name,
1862
f_decimals(pack_flag),
1864
f_is_dec(pack_flag)== 0);
1865
case DRIZZLE_TYPE_TINY:
1867
case DRIZZLE_TYPE_LONG:
1868
return new Field_long(ptr,field_length,null_pos,null_bit,
1869
unireg_check, field_name,
1871
f_is_dec(pack_flag) == 0);
1872
case DRIZZLE_TYPE_LONGLONG:
1873
return new Field_int64_t(ptr,field_length,null_pos,null_bit,
1874
unireg_check, field_name,
1876
f_is_dec(pack_flag) == 0);
1877
case DRIZZLE_TYPE_TIMESTAMP:
1878
return new Field_timestamp(ptr,field_length, null_pos, null_bit,
1879
unireg_check, field_name, share,
1881
case DRIZZLE_TYPE_DATE:
1882
return new Field_date(ptr,null_pos,null_bit,
1883
unireg_check, field_name, field_charset);
1884
case DRIZZLE_TYPE_TIME:
1885
return new Field_time(ptr,null_pos,null_bit,
1886
unireg_check, field_name, field_charset);
1887
case DRIZZLE_TYPE_DATETIME:
1888
return new Field_datetime(ptr,null_pos,null_bit,
1889
unireg_check, field_name, field_charset);
1890
case DRIZZLE_TYPE_NULL:
1891
return new Field_null(ptr, field_length, unireg_check, field_name,
1893
case DRIZZLE_TYPE_VIRTUAL: // Must not happen
1895
default: // Impossible (Wrong version)
1902
/** Create a field suitable for create of table. */
1904
Create_field::Create_field(Field *old_field,Field *orig_field)
1907
field_name=change=old_field->field_name;
1908
length= old_field->field_length;
1909
flags= old_field->flags;
1910
unireg_check=old_field->unireg_check;
1911
pack_length=old_field->pack_length();
1912
key_length= old_field->key_length();
1913
sql_type= old_field->real_type();
1914
charset= old_field->charset(); // May be NULL ptr
1915
comment= old_field->comment;
1916
decimals= old_field->decimals();
1917
vcol_info= old_field->vcol_info;
1918
is_stored= old_field->is_stored;
1920
/* Fix if the original table had 4 byte pointer blobs */
1921
if (flags & BLOB_FLAG)
1922
pack_length= (pack_length- old_field->table->s->blob_ptr_size +
1923
portable_sizeof_char_ptr);
1926
case DRIZZLE_TYPE_BLOB:
1927
sql_type= DRIZZLE_TYPE_BLOB;
1928
length/= charset->mbmaxlen;
1929
key_length/= charset->mbmaxlen;
1931
/* Change CHAR -> VARCHAR if dynamic record length */
1932
case DRIZZLE_TYPE_ENUM:
1933
case DRIZZLE_TYPE_VARCHAR:
1934
/* This is corrected in create_length_to_internal_length */
1935
length= (length+charset->mbmaxlen-1) / charset->mbmaxlen;
1941
if (flags & (ENUM_FLAG | SET_FLAG))
1942
interval= ((Field_enum*) old_field)->typelib;
1946
char_length= length;
1948
if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) &&
1949
old_field->ptr && orig_field &&
1950
(sql_type != DRIZZLE_TYPE_TIMESTAMP || /* set def only if */
1951
old_field->table->timestamp_field != old_field || /* timestamp field */
1952
unireg_check == Field::TIMESTAMP_UN_FIELD)) /* has default val */
1954
char buff[MAX_FIELD_WIDTH];
1955
String tmp(buff,sizeof(buff), charset);
1958
/* Get the value from default_values */
1959
diff= (my_ptrdiff_t) (orig_field->table->s->default_values-
1960
orig_field->table->record[0]);
1961
orig_field->move_field_offset(diff); // Points now at default_values
1962
if (!orig_field->is_real_null())
1964
char buff[MAX_FIELD_WIDTH], *pos;
1965
String tmp(buff, sizeof(buff), charset), *res;
1966
res= orig_field->val_str(&tmp);
1967
pos= (char*) sql_strmake(res->ptr(), res->length());
1968
def= new Item_string(pos, res->length(), charset);
1970
orig_field->move_field_offset(-diff); // Back to record[0]
982
1975
/*****************************************************************************
983
1976
Warning handling
984
1977
*****************************************************************************/
986
bool Field::set_warning(DRIZZLE_ERROR::enum_warning_level level,
1980
Produce warning or note about data saved into field.
1982
@param level - level of message (Note/Warning/Error)
1983
@param code - error code of message to be produced
1984
@param cuted_increment - whenever we should increase cut fields count or not
1987
This function won't produce warning and increase cut fields counter
1988
if count_cuted_fields == CHECK_FIELD_IGNORE for current thread.
1990
if count_cuted_fields == CHECK_FIELD_IGNORE then we ignore notes.
1991
This allows us to avoid notes in optimisation, like convert_constant_item().
1994
1 if count_cuted_fields == CHECK_FIELD_IGNORE and error level is not NOTE
2000
Field::set_warning(DRIZZLE_ERROR::enum_warning_level level, uint32_t code,
2001
int cuted_increment)
991
2004
If this field was created only for type conversion purposes it