88
88
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
89
89
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
90
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
91
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
92
92
//DRIZZLE_TYPE_DOUBLE
93
93
DRIZZLE_TYPE_DOUBLE,
94
94
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
95
95
DRIZZLE_TYPE_TINY, DRIZZLE_TYPE_VARCHAR,
96
96
//DRIZZLE_TYPE_LONGLONG
97
97
DRIZZLE_TYPE_LONGLONG,
98
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
99
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
100
//DRIZZLE_TYPE_DATETIME
101
99
DRIZZLE_TYPE_VARCHAR,
102
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
103
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
104
// DRIZZLE_TYPE_VIRTUAL
105
DRIZZLE_TYPE_VIRTUAL,
106
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
107
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
111
/* DRIZZLE_TYPE_SHORT -> */
113
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
114
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_SHORT,
115
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
116
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
117
//DRIZZLE_TYPE_DOUBLE
119
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
120
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_VARCHAR,
121
//DRIZZLE_TYPE_LONGLONG
122
DRIZZLE_TYPE_LONGLONG,
123
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
124
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
125
100
//DRIZZLE_TYPE_DATETIME
126
101
DRIZZLE_TYPE_VARCHAR,
127
102
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
258
233
//DRIZZLE_TYPE_BLOB
259
234
DRIZZLE_TYPE_BLOB,
261
/* DRIZZLE_TYPE_DATE -> */
263
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
264
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
265
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
266
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
267
//DRIZZLE_TYPE_DOUBLE
268
DRIZZLE_TYPE_VARCHAR,
269
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
270
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
271
//DRIZZLE_TYPE_LONGLONG
272
DRIZZLE_TYPE_VARCHAR,
273
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
274
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
275
//DRIZZLE_TYPE_DATETIME
276
DRIZZLE_TYPE_DATETIME,
277
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
278
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
279
// DRIZZLE_TYPE_VIRTUAL
280
DRIZZLE_TYPE_VIRTUAL,
281
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
282
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
286
236
/* DRIZZLE_TYPE_TIME -> */
288
238
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
289
239
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
290
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
291
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
241
DRIZZLE_TYPE_VARCHAR,
292
242
//DRIZZLE_TYPE_DOUBLE
293
243
DRIZZLE_TYPE_VARCHAR,
294
244
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
295
245
DRIZZLE_TYPE_TIME, DRIZZLE_TYPE_DATETIME,
296
246
//DRIZZLE_TYPE_LONGLONG
297
247
DRIZZLE_TYPE_VARCHAR,
298
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
299
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_TIME,
300
250
//DRIZZLE_TYPE_DATETIME
301
251
DRIZZLE_TYPE_DATETIME,
302
252
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
1468
1418
String *val_ptr __attribute__((unused)))
1470
1420
const CHARSET_INFO * const cs= &my_charset_bin;
1472
uint mlength=max(field_length+1,5*cs->mbmaxlen);
1422
uint32_t mlength=cmax(field_length+1,5*cs->mbmaxlen);
1473
1423
val_buffer->alloc(mlength);
1474
1424
char *to=(char*) val_buffer->ptr();
1476
1426
if (unsigned_flag)
1477
length= (uint) cs->cset->long10_to_str(cs,to,mlength, 10,
1427
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength, 10,
1480
length= (uint) cs->cset->long10_to_str(cs,to,mlength,-10,
1430
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength,-10,
1481
1431
(long) *((signed char*) ptr));
1483
1433
val_buffer->length(length);
1713
/****************************************************************************
1715
** This is a string which only can have a selection of different values.
1716
** If one uses this string in a number context one gets the type number.
1717
****************************************************************************/
1719
enum ha_base_keytype Field_enum::key_type() const
1721
switch (packlength) {
1722
default: return HA_KEYTYPE_BINARY;
1723
case 2: return HA_KEYTYPE_USHORT_INT;
1724
case 3: return HA_KEYTYPE_UINT24;
1725
case 4: return HA_KEYTYPE_ULONG_INT;
1726
case 8: return HA_KEYTYPE_ULONGLONG;
1730
void Field_enum::store_type(uint64_t value)
1732
switch (packlength) {
1733
case 1: ptr[0]= (uchar) value; break;
1735
#ifdef WORDS_BIGENDIAN
1736
if (table->s->db_low_byte_first)
1738
int2store(ptr,(unsigned short) value);
1742
shortstore(ptr,(unsigned short) value);
1744
case 3: int3store(ptr,(long) value); break;
1746
#ifdef WORDS_BIGENDIAN
1747
if (table->s->db_low_byte_first)
1749
int4store(ptr,value);
1753
longstore(ptr,(long) value);
1756
#ifdef WORDS_BIGENDIAN
1757
if (table->s->db_low_byte_first)
1759
int8store(ptr,value);
1763
int64_tstore(ptr,value); break;
1770
Storing a empty string in a enum field gives a warning
1771
(if there isn't a empty value in the enum)
1774
int Field_enum::store(const char *from, uint length, const CHARSET_INFO * const cs)
1778
char buff[STRING_BUFFER_USUAL_SIZE];
1779
String tmpstr(buff,sizeof(buff), &my_charset_bin);
1781
/* Convert character set if necessary */
1782
if (String::needs_conversion(length, cs, field_charset, ¬_used))
1785
tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
1787
length= tmpstr.length();
1790
/* Remove end space */
1791
length= field_charset->cset->lengthsp(field_charset, from, length);
1792
uint tmp=find_type2(typelib, from, length, field_charset);
1795
if (length < 6) // Can't be more than 99999 enums
1797
/* This is for reading numbers with LOAD DATA INFILE */
1799
tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
1800
if (err || end != from+length || tmp > typelib->count)
1803
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1805
if (!table->in_use->count_cuted_fields)
1809
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1811
store_type((uint64_t) tmp);
1816
int Field_enum::store(double nr)
1818
return Field_enum::store((int64_t) nr, false);
1822
int Field_enum::store(int64_t nr,
1823
bool unsigned_val __attribute__((unused)))
1826
if ((uint64_t) nr > typelib->count || nr == 0)
1828
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1829
if (nr != 0 || table->in_use->count_cuted_fields)
1835
store_type((uint64_t) (uint) nr);
1840
double Field_enum::val_real(void)
1842
return (double) Field_enum::val_int();
1846
int64_t Field_enum::val_int(void)
1848
switch (packlength) {
1850
return (int64_t) ptr[0];
1854
#ifdef WORDS_BIGENDIAN
1855
if (table->s->db_low_byte_first)
1860
return (int64_t) tmp;
1863
return (int64_t) uint3korr(ptr);
1867
#ifdef WORDS_BIGENDIAN
1868
if (table->s->db_low_byte_first)
1873
return (int64_t) tmp;
1878
#ifdef WORDS_BIGENDIAN
1879
if (table->s->db_low_byte_first)
1883
int64_tget(tmp,ptr);
1887
return 0; // impossible
1892
Save the field metadata for enum fields.
1894
Saves the real type in the first byte and the pack length in the
1895
second byte of the field metadata array at index of *metadata_ptr and
1896
*(metadata_ptr + 1).
1898
@param metadata_ptr First byte of field metadata
1900
@returns number of bytes written to metadata_ptr
1902
int Field_enum::do_save_field_metadata(uchar *metadata_ptr)
1904
*metadata_ptr= real_type();
1905
*(metadata_ptr + 1)= pack_length();
1910
String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
1913
uint tmp=(uint) Field_enum::val_int();
1914
if (!tmp || tmp > typelib->count)
1915
val_ptr->set("", 0, field_charset);
1917
val_ptr->set((const char*) typelib->type_names[tmp-1],
1918
typelib->type_lengths[tmp-1],
1923
int Field_enum::cmp(const uchar *a_ptr, const uchar *b_ptr)
1926
ptr= (uchar*) a_ptr;
1927
uint64_t a=Field_enum::val_int();
1928
ptr= (uchar*) b_ptr;
1929
uint64_t b=Field_enum::val_int();
1931
return (a < b) ? -1 : (a > b) ? 1 : 0;
1934
void Field_enum::sort_string(uchar *to,uint length __attribute__((unused)))
1936
uint64_t value=Field_enum::val_int();
1938
for (uint i=0 ; i < packlength ; i++)
1940
*to-- = (uchar) (value & 255);
1946
void Field_enum::sql_type(String &res) const
1949
String enum_item(buffer, sizeof(buffer), res.charset());
1952
res.append(STRING_WITH_LEN("enum("));
1955
uint *len= typelib->type_lengths;
1956
for (const char **pos= typelib->type_names; *pos; pos++, len++)
1961
/* convert to res.charset() == utf8, then quote */
1962
enum_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
1963
append_unescaped(&res, enum_item.ptr(), enum_item.length());
1970
Field *Field_enum::new_field(MEM_ROOT *root, Table *new_table,
1973
Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
1975
res->typelib= copy_typelib(root, typelib);
1982
1665
1 if the fields are equally defined
2127
1810
bool Create_field::init(THD *thd __attribute__((unused)), char *fld_name, enum_field_types fld_type,
2128
1811
char *fld_length, char *fld_decimals,
2129
uint fld_type_modifier, Item *fld_default_value,
1812
uint32_t fld_type_modifier, Item *fld_default_value,
2130
1813
Item *fld_on_update_value, LEX_STRING *fld_comment,
2131
1814
char *fld_change, List<String> *fld_interval_list,
2132
1815
const CHARSET_INFO * const fld_charset,
2133
uint fld_geom_type __attribute__((unused)),
1816
uint32_t fld_geom_type __attribute__((unused)),
2134
1817
enum column_format_type column_format,
2135
1818
virtual_column_info *fld_vcol_info)
2137
uint sign_len, allowed_type_modifier= 0;
1820
uint32_t sign_len, allowed_type_modifier= 0;
2138
1821
uint32_t max_field_charlength= MAX_FIELD_CHARLENGTH;
2141
1824
field_name= fld_name;
2142
1825
def= fld_default_value;
2143
1826
flags= fld_type_modifier;
2144
flags|= (((uint)column_format & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
1827
flags|= (((uint32_t)column_format & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
2145
1828
unireg_check= (fld_type_modifier & AUTO_INCREMENT_FLAG ?
2146
1829
Field::NEXT_NUMBER : Field::NONE);
2147
decimals= fld_decimals ? (uint)atoi(fld_decimals) : 0;
1830
decimals= fld_decimals ? (uint32_t)atoi(fld_decimals) : 0;
2148
1831
if (decimals >= NOT_FIXED_DEC)
2150
1833
my_error(ER_TOO_BIG_SCALE, MYF(0), decimals, fld_name,
2444
uint pack_length_to_packflag(uint type)
2116
uint32_t pack_length_to_packflag(uint32_t type)
2446
2118
switch (type) {
2447
case 1: return f_settype((uint) DRIZZLE_TYPE_TINY);
2448
case 2: return f_settype((uint) DRIZZLE_TYPE_SHORT);
2119
case 1: return f_settype((uint32_t) DRIZZLE_TYPE_TINY);
2449
2121
case 3: assert(1);
2450
case 4: return f_settype((uint) DRIZZLE_TYPE_LONG);
2451
case 8: return f_settype((uint) DRIZZLE_TYPE_LONGLONG);
2122
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
2123
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
2453
2125
return 0; // This shouldn't happen
2457
Field *make_field(TABLE_SHARE *share, uchar *ptr, uint32_t field_length,
2458
uchar *null_pos, uchar null_bit,
2129
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
2130
unsigned char *null_pos, unsigned char null_bit,
2460
2132
enum_field_types field_type,
2461
2133
const CHARSET_INFO * field_charset,
2462
2134
Field::utype unireg_check,