27 #include <drizzled/sql_select.h>
28 #include <drizzled/error.h>
29 #include <drizzled/field.h>
30 #include <drizzled/create_field.h>
31 #include <drizzled/field/str.h>
32 #include <drizzled/field/num.h>
33 #include <drizzled/field/blob.h>
34 #include <drizzled/field/boolean.h>
35 #include <drizzled/field/enum.h>
36 #include <drizzled/field/null.h>
37 #include <drizzled/field/date.h>
38 #include <drizzled/field/decimal.h>
39 #include <drizzled/field/real.h>
40 #include <drizzled/field/double.h>
41 #include <drizzled/field/int32.h>
42 #include <drizzled/field/int64.h>
43 #include <drizzled/field/num.h>
44 #include <drizzled/field/epoch.h>
45 #include <drizzled/field/datetime.h>
46 #include <drizzled/field/varstring.h>
47 #include <drizzled/field/uuid.h>
48 #include <drizzled/field/ipv6.h>
50 #include <drizzled/item/string.h>
51 #include <drizzled/table.h>
53 #include <drizzled/display.h>
63 CreateField::CreateField(
Field *old_field,
Field *orig_field)
68 flags= old_field->flags;
69 unireg_check= old_field->unireg_check;
71 key_length= old_field->key_length();
72 sql_type= old_field->real_type();
73 charset= old_field->charset();
75 decimals= old_field->decimals();
78 if (flags & BLOB_FLAG)
80 pack_length= (pack_length - old_field->getTable()->getShare()->sizeBlobPtr() + portable_sizeof_char_ptr);
85 case DRIZZLE_TYPE_BLOB:
86 sql_type= DRIZZLE_TYPE_BLOB;
87 length/= charset->mbmaxlen;
88 key_length/= charset->mbmaxlen;
90 case DRIZZLE_TYPE_ENUM:
91 case DRIZZLE_TYPE_VARCHAR:
93 length= (length+charset->mbmaxlen-1) / charset->mbmaxlen;
99 if (flags & ENUM_FLAG)
106 if (!(flags & (NO_DEFAULT_VALUE_FLAG)) &&
107 !(flags & AUTO_INCREMENT_FLAG) &&
108 old_field->
ptr && orig_field &&
109 (not old_field->is_timestamp() ||
111 unireg_check == Field::TIMESTAMP_UN_FIELD))
114 ptrdiff_t diff= (ptrdiff_t) (orig_field->getTable()->getDefaultValues() - orig_field->getTable()->getInsertRecord());
115 orig_field->move_field_offset(diff);
116 if (! orig_field->is_real_null())
118 char buff[MAX_FIELD_WIDTH];
119 String tmp(buff,
sizeof(buff), charset);
120 String* res= orig_field->val_str_internal(&tmp);
121 char* pos= memory::sql_strdup(*res);
124 orig_field->move_field_offset(-diff);
131 void CreateField::create_length_to_internal_length(
void)
135 case DRIZZLE_TYPE_BLOB:
136 case DRIZZLE_TYPE_VARCHAR:
137 length*= charset->mbmaxlen;
139 pack_length= calc_pack_length(sql_type, length);
141 case DRIZZLE_TYPE_ENUM:
143 length*= charset->mbmaxlen;
144 key_length= pack_length;
146 case DRIZZLE_TYPE_DECIMAL:
147 key_length= pack_length=
148 class_decimal_get_binary_size(class_decimal_length_to_precision(length,
155 key_length= pack_length= calc_pack_length(sql_type, length);
163 void CreateField::init_for_tmp_table(enum_field_types sql_type_arg,
165 uint32_t decimals_arg,
169 sql_type= sql_type_arg;
170 char_length= length= length_arg;;
171 unireg_check= Field::NONE;
173 charset= &my_charset_bin;
174 decimals= decimals_arg & FIELDFLAG_MAX_DEC;
176 flags= maybe_null ? 0 : NOT_NULL_FLAG;
180 const char *fld_name,
181 enum_field_types fld_type,
182 const char *fld_length,
183 const char *fld_decimals,
184 uint32_t fld_type_modifier,
186 const char *fld_change,
190 column_format_type column_format_in)
192 uint32_t sign_len= 0;
193 uint32_t allowed_type_modifier= 0;
194 uint32_t max_field_charlength= MAX_FIELD_CHARLENGTH;
197 field_name= fld_name;
198 flags= fld_type_modifier;
199 flags|= (((uint32_t)column_format_in & COLUMN_FORMAT_MASK) << COLUMN_FORMAT_FLAGS);
200 unireg_check= (fld_type_modifier & AUTO_INCREMENT_FLAG ?
201 Field::NEXT_NUMBER : Field::NONE);
202 decimals= fld_decimals ? (uint32_t)atoi(fld_decimals) : 0;
203 if (decimals >= NOT_FIXED_DEC)
205 my_error(ER_TOO_BIG_SCALE, MYF(0), decimals, fld_name,
214 pack_length= key_length= 0;
215 charset= fld_charset;
216 interval_list.clear();
218 comment= fld_comment;
220 if (fld_length && !(length= (uint32_t) atoi(fld_length)))
222 sign_len= fld_type_modifier & UNSIGNED_FLAG ? 0 : 1;
226 case DRIZZLE_TYPE_LONG:
228 length= MAX_INT_WIDTH+sign_len;
229 allowed_type_modifier= AUTO_INCREMENT_FLAG;
231 case DRIZZLE_TYPE_LONGLONG:
233 length= MAX_BIGINT_WIDTH;
234 allowed_type_modifier= AUTO_INCREMENT_FLAG;
236 case DRIZZLE_TYPE_NULL:
238 case DRIZZLE_TYPE_DECIMAL:
239 class_decimal_trim(&length, &decimals);
240 if (length > DECIMAL_MAX_PRECISION)
242 my_error(ER_TOO_BIG_PRECISION, MYF(0), length, fld_name,
243 DECIMAL_MAX_PRECISION);
246 if (length < decimals)
248 my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
251 length= class_decimal_precision_to_length(length, decimals, fld_type_modifier & UNSIGNED_FLAG);
252 pack_length= class_decimal_get_binary_size(length, decimals);
254 case DRIZZLE_TYPE_VARCHAR:
259 max_field_charlength= MAX_FIELD_VARCHARLENGTH;
261 case DRIZZLE_TYPE_BLOB:
264 case DRIZZLE_TYPE_DOUBLE:
265 allowed_type_modifier= AUTO_INCREMENT_FLAG;
266 if (!fld_length && !fld_decimals)
269 decimals= NOT_FIXED_DEC;
271 if (length < decimals &&
272 decimals != NOT_FIXED_DEC)
274 my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
278 case DRIZZLE_TYPE_MICROTIME:
285 case DRIZZLE_TYPE_TIMESTAMP:
286 length= MicroTimestamp::MAX_STRING_LENGTH;
288 case DRIZZLE_TYPE_DATE:
289 length= Date::MAX_STRING_LENGTH;
291 case DRIZZLE_TYPE_UUID:
292 length= field::Uuid::max_string_length();
294 case DRIZZLE_TYPE_IPV6:
295 length= field::IPv6::max_string_length();
297 case DRIZZLE_TYPE_BOOLEAN:
298 length= field::Boolean::max_string_length();
300 case DRIZZLE_TYPE_DATETIME:
301 length= DateTime::MAX_STRING_LENGTH;
303 case DRIZZLE_TYPE_TIME:
304 length= DateTime::MAX_STRING_LENGTH;
306 case DRIZZLE_TYPE_ENUM:
313 interval_list.push_back(tmp);
321 if (!(flags & BLOB_FLAG) &&
322 ((length > max_field_charlength &&
323 fld_type != DRIZZLE_TYPE_ENUM &&
324 (fld_type != DRIZZLE_TYPE_VARCHAR)) ||
325 (!length && fld_type != DRIZZLE_TYPE_VARCHAR)))
327 my_error((fld_type == DRIZZLE_TYPE_VARCHAR) ? ER_TOO_BIG_FIELDLENGTH : ER_TOO_BIG_DISPLAYWIDTH,
329 fld_name, max_field_charlength / (charset? charset->mbmaxlen : 1));
332 fld_type_modifier&= AUTO_INCREMENT_FLAG;
333 if ((~allowed_type_modifier) & fld_type_modifier)
335 my_error(ER_WRONG_FIELD_SPEC, MYF(0), fld_name);
342 bool CreateField::setDefaultValue(
Item *default_value_item,
343 Item *on_update_item)
345 def= default_value_item;
351 if (! default_value_item
352 && ! (flags & AUTO_INCREMENT_FLAG)
353 && (flags & NOT_NULL_FLAG)
354 && (sql_type != DRIZZLE_TYPE_TIMESTAMP
355 and sql_type != DRIZZLE_TYPE_MICROTIME))
357 flags|= NO_DEFAULT_VALUE_FLAG;
361 flags&= ~NO_DEFAULT_VALUE_FLAG;
364 if (sql_type == DRIZZLE_TYPE_BLOB && default_value_item)
368 String* res= default_value_item->
val_str(&str);
371 my_error(ER_BLOB_CANT_HAVE_DEFAULT, MYF(0), field_name);
376 if (sql_type == DRIZZLE_TYPE_TIMESTAMP
377 || sql_type == DRIZZLE_TYPE_MICROTIME)
379 bool on_update_now= on_update_item
380 || (unireg_check == Field::TIMESTAMP_DNUN_FIELD
381 || unireg_check == Field::TIMESTAMP_UN_FIELD);
383 if (default_value_item)
386 if (default_value_item->type() == Item::FUNC_ITEM &&
387 ((Item_func*)default_value_item)->functype() == Item_func::NOW_FUNC)
389 unireg_check= (on_update_now ? Field::TIMESTAMP_DNUN_FIELD:
390 Field::TIMESTAMP_DN_FIELD);
399 unireg_check= on_update_now ? Field::TIMESTAMP_UN_FIELD : Field::NONE;
417 unireg_check= on_update_now ? Field::TIMESTAMP_UN_FIELD :
418 (flags & NOT_NULL_FLAG ? Field::TIMESTAMP_OLD_FIELD : Field::NONE);
425 std::ostream& operator<<(std::ostream& output,
const CreateField &field)
427 output <<
"CreateField:(";
428 output << field.field_name;
430 output << display::type(field.type());
433 if (field.flags & NOT_NULL_FLAG)
434 output <<
" NOT_NULL";
436 if (field.flags & PRI_KEY_FLAG)
437 output <<
", PRIMARY KEY";
439 if (field.flags & UNIQUE_KEY_FLAG)
440 output <<
", UNIQUE KEY";
442 if (field.flags & MULTIPLE_KEY_FLAG)
443 output <<
", MULTIPLE KEY";
445 if (field.flags & BLOB_FLAG)
448 if (field.flags & UNSIGNED_FLAG)
449 output <<
", UNSIGNED";
451 if (field.flags & BINARY_FLAG)
452 output <<
", BINARY";
455 output << *field.field;
virtual uint32_t pack_length() const
TODO: Rename this file - func.h is stupid.
virtual String * val_str(String *str)=0
field::Epoch * timestamp_field