86
88
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
87
89
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
90
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
91
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
90
92
//DRIZZLE_TYPE_DOUBLE
91
93
DRIZZLE_TYPE_DOUBLE,
92
94
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
93
95
DRIZZLE_TYPE_TINY, DRIZZLE_TYPE_VARCHAR,
94
96
//DRIZZLE_TYPE_LONGLONG
95
97
DRIZZLE_TYPE_LONGLONG,
98
//DRIZZLE_TYPE_DATETIME
100
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
101
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
102
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
103
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
98
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
99
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
100
//DRIZZLE_TYPE_DATETIME
101
DRIZZLE_TYPE_VARCHAR,
102
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
103
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
104
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
105
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
107
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
//DRIZZLE_TYPE_DATETIME
126
DRIZZLE_TYPE_VARCHAR,
127
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
128
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
129
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
130
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
132
DRIZZLE_TYPE_VARCHAR,
104
133
//DRIZZLE_TYPE_BLOB
105
134
DRIZZLE_TYPE_BLOB,
201
238
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
202
239
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONGLONG,
204
DRIZZLE_TYPE_LONGLONG,
240
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
241
DRIZZLE_TYPE_LONGLONG, DRIZZLE_TYPE_LONGLONG,
205
242
//DRIZZLE_TYPE_DOUBLE
206
243
DRIZZLE_TYPE_DOUBLE,
207
244
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
208
245
DRIZZLE_TYPE_LONGLONG, DRIZZLE_TYPE_VARCHAR,
209
246
//DRIZZLE_TYPE_LONGLONG
210
247
DRIZZLE_TYPE_LONGLONG,
212
DRIZZLE_TYPE_VARCHAR,
248
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
249
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
213
250
//DRIZZLE_TYPE_DATETIME
214
251
DRIZZLE_TYPE_VARCHAR,
215
252
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
216
253
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
217
254
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
218
255
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
257
DRIZZLE_TYPE_VARCHAR,
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_NEWDECIMAL DRIZZLE_TYPE_ENUM
280
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
282
DRIZZLE_TYPE_VARCHAR,
219
283
//DRIZZLE_TYPE_BLOB
220
284
DRIZZLE_TYPE_BLOB,
339
413
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
340
414
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
342
DRIZZLE_TYPE_VARCHAR,
415
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
416
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
343
417
//DRIZZLE_TYPE_DOUBLE
344
418
DRIZZLE_TYPE_VARCHAR,
345
419
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
346
420
DRIZZLE_TYPE_ENUM, DRIZZLE_TYPE_VARCHAR,
347
421
//DRIZZLE_TYPE_LONGLONG
348
422
DRIZZLE_TYPE_VARCHAR,
350
DRIZZLE_TYPE_VARCHAR,
351
//DRIZZLE_TYPE_DATETIME
352
DRIZZLE_TYPE_VARCHAR,
353
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
354
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
355
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
356
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
423
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
424
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
425
//DRIZZLE_TYPE_DATETIME
426
DRIZZLE_TYPE_VARCHAR,
427
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
428
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
429
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
430
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
432
DRIZZLE_TYPE_VARCHAR,
436
/* DRIZZLE_TYPE_SET -> */
438
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
439
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
440
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
441
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
442
//DRIZZLE_TYPE_DOUBLE
443
DRIZZLE_TYPE_VARCHAR,
444
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
445
DRIZZLE_TYPE_SET, DRIZZLE_TYPE_VARCHAR,
446
//DRIZZLE_TYPE_LONGLONG
447
DRIZZLE_TYPE_VARCHAR,
448
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
449
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
450
//DRIZZLE_TYPE_DATETIME
451
DRIZZLE_TYPE_VARCHAR,
452
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
453
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
454
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
455
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
457
DRIZZLE_TYPE_VARCHAR,
357
458
//DRIZZLE_TYPE_BLOB
358
459
DRIZZLE_TYPE_BLOB,
1362
1467
String *val_ptr __attribute__((unused)))
1364
1469
const CHARSET_INFO * const cs= &my_charset_bin;
1366
uint32_t mlength=cmax(field_length+1,5*cs->mbmaxlen);
1471
uint mlength=max(field_length+1,5*cs->mbmaxlen);
1367
1472
val_buffer->alloc(mlength);
1368
1473
char *to=(char*) val_buffer->ptr();
1370
1475
if (unsigned_flag)
1371
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength, 10,
1476
length= (uint) cs->cset->long10_to_str(cs,to,mlength, 10,
1374
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength,-10,
1479
length= (uint) cs->cset->long10_to_str(cs,to,mlength,-10,
1375
1480
(long) *((signed char*) ptr));
1377
1482
val_buffer->length(length);
1712
/****************************************************************************
1714
** This is a string which only can have a selection of different values.
1715
** If one uses this string in a number context one gets the type number.
1716
****************************************************************************/
1718
enum ha_base_keytype Field_enum::key_type() const
1720
switch (packlength) {
1721
default: return HA_KEYTYPE_BINARY;
1722
case 2: return HA_KEYTYPE_USHORT_INT;
1723
case 3: return HA_KEYTYPE_UINT24;
1724
case 4: return HA_KEYTYPE_ULONG_INT;
1725
case 8: return HA_KEYTYPE_ULONGLONG;
1729
void Field_enum::store_type(uint64_t value)
1731
switch (packlength) {
1732
case 1: ptr[0]= (uchar) value; break;
1734
#ifdef WORDS_BIGENDIAN
1735
if (table->s->db_low_byte_first)
1737
int2store(ptr,(unsigned short) value);
1741
shortstore(ptr,(unsigned short) value);
1743
case 3: int3store(ptr,(long) value); break;
1745
#ifdef WORDS_BIGENDIAN
1746
if (table->s->db_low_byte_first)
1748
int4store(ptr,value);
1752
longstore(ptr,(long) value);
1755
#ifdef WORDS_BIGENDIAN
1756
if (table->s->db_low_byte_first)
1758
int8store(ptr,value);
1762
int64_tstore(ptr,value); break;
1769
Storing a empty string in a enum field gives a warning
1770
(if there isn't a empty value in the enum)
1773
int Field_enum::store(const char *from, uint length, const CHARSET_INFO * const cs)
1777
char buff[STRING_BUFFER_USUAL_SIZE];
1778
String tmpstr(buff,sizeof(buff), &my_charset_bin);
1780
/* Convert character set if necessary */
1781
if (String::needs_conversion(length, cs, field_charset, ¬_used))
1784
tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
1786
length= tmpstr.length();
1789
/* Remove end space */
1790
length= field_charset->cset->lengthsp(field_charset, from, length);
1791
uint tmp=find_type2(typelib, from, length, field_charset);
1794
if (length < 6) // Can't be more than 99999 enums
1796
/* This is for reading numbers with LOAD DATA INFILE */
1798
tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
1799
if (err || end != from+length || tmp > typelib->count)
1802
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1804
if (!table->in_use->count_cuted_fields)
1808
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1810
store_type((uint64_t) tmp);
1815
int Field_enum::store(double nr)
1817
return Field_enum::store((int64_t) nr, false);
1821
int Field_enum::store(int64_t nr,
1822
bool unsigned_val __attribute__((unused)))
1825
if ((uint64_t) nr > typelib->count || nr == 0)
1827
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1828
if (nr != 0 || table->in_use->count_cuted_fields)
1834
store_type((uint64_t) (uint) nr);
1839
double Field_enum::val_real(void)
1841
return (double) Field_enum::val_int();
1845
int64_t Field_enum::val_int(void)
1847
switch (packlength) {
1849
return (int64_t) ptr[0];
1853
#ifdef WORDS_BIGENDIAN
1854
if (table->s->db_low_byte_first)
1859
return (int64_t) tmp;
1862
return (int64_t) uint3korr(ptr);
1866
#ifdef WORDS_BIGENDIAN
1867
if (table->s->db_low_byte_first)
1872
return (int64_t) tmp;
1877
#ifdef WORDS_BIGENDIAN
1878
if (table->s->db_low_byte_first)
1882
int64_tget(tmp,ptr);
1886
return 0; // impossible
1891
Save the field metadata for enum fields.
1893
Saves the real type in the first byte and the pack length in the
1894
second byte of the field metadata array at index of *metadata_ptr and
1895
*(metadata_ptr + 1).
1897
@param metadata_ptr First byte of field metadata
1899
@returns number of bytes written to metadata_ptr
1901
int Field_enum::do_save_field_metadata(uchar *metadata_ptr)
1903
*metadata_ptr= real_type();
1904
*(metadata_ptr + 1)= pack_length();
1909
String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
1912
uint tmp=(uint) Field_enum::val_int();
1913
if (!tmp || tmp > typelib->count)
1914
val_ptr->set("", 0, field_charset);
1916
val_ptr->set((const char*) typelib->type_names[tmp-1],
1917
typelib->type_lengths[tmp-1],
1922
int Field_enum::cmp(const uchar *a_ptr, const uchar *b_ptr)
1925
ptr= (uchar*) a_ptr;
1926
uint64_t a=Field_enum::val_int();
1927
ptr= (uchar*) b_ptr;
1928
uint64_t b=Field_enum::val_int();
1930
return (a < b) ? -1 : (a > b) ? 1 : 0;
1933
void Field_enum::sort_string(uchar *to,uint length __attribute__((unused)))
1935
uint64_t value=Field_enum::val_int();
1937
for (uint i=0 ; i < packlength ; i++)
1939
*to-- = (uchar) (value & 255);
1945
void Field_enum::sql_type(String &res) const
1948
String enum_item(buffer, sizeof(buffer), res.charset());
1951
res.append(STRING_WITH_LEN("enum("));
1954
uint *len= typelib->type_lengths;
1955
for (const char **pos= typelib->type_names; *pos; pos++, len++)
1960
/* convert to res.charset() == utf8, then quote */
1961
enum_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
1962
append_unescaped(&res, enum_item.ptr(), enum_item.length());
1969
Field *Field_enum::new_field(MEM_ROOT *root, struct st_table *new_table,
1972
Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
1974
res->typelib= copy_typelib(root, typelib);
1609
1981
1 if the fields are equally defined
1751
bool Create_field::init(THD *thd __attribute__((unused)), char *fld_name, enum_field_types fld_type,
2124
bool Create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
1752
2125
char *fld_length, char *fld_decimals,
1753
uint32_t fld_type_modifier, Item *fld_default_value,
2126
uint fld_type_modifier, Item *fld_default_value,
1754
2127
Item *fld_on_update_value, LEX_STRING *fld_comment,
1755
2128
char *fld_change, List<String> *fld_interval_list,
1756
2129
const CHARSET_INFO * const fld_charset,
1757
uint32_t fld_geom_type __attribute__((unused)),
2130
uint fld_geom_type __attribute__((unused)),
1758
2131
enum column_format_type column_format)
1760
uint32_t sign_len, allowed_type_modifier= 0;
2133
uint sign_len, allowed_type_modifier= 0;
1761
2134
uint32_t max_field_charlength= MAX_FIELD_CHARLENGTH;
1764
2137
field_name= fld_name;
1765
2138
def= fld_default_value;
1766
2139
flags= fld_type_modifier;
1767
flags|= (((uint32_t)column_format & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
2140
flags|= (((uint)column_format & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
1768
2141
unireg_check= (fld_type_modifier & AUTO_INCREMENT_FLAG ?
1769
2142
Field::NEXT_NUMBER : Field::NONE);
1770
decimals= fld_decimals ? (uint32_t)atoi(fld_decimals) : 0;
2143
decimals= fld_decimals ? (uint)atoi(fld_decimals) : 0;
1771
2144
if (decimals >= NOT_FIXED_DEC)
1773
2146
my_error(ER_TOO_BIG_SCALE, MYF(0), decimals, fld_name,
2004
uint32_t pack_length_to_packflag(uint32_t type)
2428
uint pack_length_to_packflag(uint type)
2006
2430
switch (type) {
2007
case 1: return f_settype((uint32_t) DRIZZLE_TYPE_TINY);
2431
case 1: return f_settype((uint) DRIZZLE_TYPE_TINY);
2432
case 2: return f_settype((uint) DRIZZLE_TYPE_SHORT);
2009
2433
case 3: assert(1);
2010
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
2011
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
2434
case 4: return f_settype((uint) DRIZZLE_TYPE_LONG);
2435
case 8: return f_settype((uint) DRIZZLE_TYPE_LONGLONG);
2013
2437
return 0; // This shouldn't happen
2017
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
2018
unsigned char *null_pos, unsigned char null_bit,
2441
Field *make_field(TABLE_SHARE *share, uchar *ptr, uint32_t field_length,
2442
uchar *null_pos, uchar null_bit,
2020
2444
enum_field_types field_type,
2021
2445
const CHARSET_INFO * field_charset,
2022
2446
Field::utype unireg_check,