21
21
* @file Implementation of CreateField class
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/enum.h"
35
#include "drizzled/field/null.h"
36
#include "drizzled/field/date.h"
37
#include "drizzled/field/decimal.h"
38
#include "drizzled/field/real.h"
39
#include "drizzled/field/double.h"
40
#include "drizzled/field/int32.h"
41
#include "drizzled/field/int64.h"
42
#include "drizzled/field/num.h"
43
#include "drizzled/field/timestamp.h"
44
#include "drizzled/field/datetime.h"
45
#include "drizzled/field/varstring.h"
46
#include "drizzled/field/uuid.h"
47
#include "drizzled/temporal.h"
48
#include "drizzled/item/string.h"
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>
49
#include <drizzled/temporal.h>
50
#include <drizzled/item/string.h>
51
#include <drizzled/table.h>
53
#include <drizzled/display.h>
50
55
#include <algorithm>
99
106
if (!(flags & (NO_DEFAULT_VALUE_FLAG)) &&
100
107
!(flags & AUTO_INCREMENT_FLAG) &&
101
108
old_field->ptr && orig_field &&
102
(sql_type != DRIZZLE_TYPE_TIMESTAMP || /* set def only if */
109
(not old_field->is_timestamp() || /* set def only if */
103
110
old_field->getTable()->timestamp_field != old_field || /* timestamp field */
104
111
unireg_check == Field::TIMESTAMP_UN_FIELD)) /* has default val */
108
113
/* Get the value from default_values */
109
diff= (ptrdiff_t) (orig_field->getTable()->getDefaultValues() - orig_field->getTable()->getInsertRecord());
114
ptrdiff_t diff= (ptrdiff_t) (orig_field->getTable()->getDefaultValues() - orig_field->getTable()->getInsertRecord());
110
115
orig_field->move_field_offset(diff); // Points now at default_values
111
116
if (! orig_field->is_real_null())
113
char buff[MAX_FIELD_WIDTH], *pos;
114
String tmp(buff, sizeof(buff), charset), *res;
115
res= orig_field->val_str_internal(&tmp);
116
pos= (char*) memory::sql_strmake(res->ptr(), res->length());
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);
117
122
def= new Item_string(pos, res->length(), charset);
119
124
orig_field->move_field_offset(-diff); // Back to getInsertRecord()
168
173
charset= &my_charset_bin;
169
174
decimals= decimals_arg & FIELDFLAG_MAX_DEC;
172
flags= NOT_NULL_FLAG;
176
flags= maybe_null ? 0 : NOT_NULL_FLAG;
177
179
bool CreateField::init(Session *,
180
const char *fld_name,
179
181
enum_field_types fld_type,
182
const char *fld_length,
183
const char *fld_decimals,
182
184
uint32_t fld_type_modifier,
183
Item *fld_default_value,
184
Item *fld_on_update_value,
185
LEX_STRING *fld_comment,
186
const char *fld_change,
187
187
List<String> *fld_interval_list,
188
const CHARSET_INFO * const fld_charset,
188
const charset_info_st* fld_charset,
190
enum column_format_type column_format_in)
190
column_format_type column_format_in)
193
192
uint32_t sign_len= 0;
194
193
uint32_t allowed_type_modifier= 0;
246
236
case DRIZZLE_TYPE_NULL:
248
238
case DRIZZLE_TYPE_DECIMAL:
249
my_decimal_trim(&length, &decimals);
239
class_decimal_trim(&length, &decimals);
250
240
if (length > DECIMAL_MAX_PRECISION)
252
242
my_error(ER_TOO_BIG_PRECISION, MYF(0), length, fld_name,
253
243
DECIMAL_MAX_PRECISION);
256
246
if (length < decimals)
258
248
my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
261
length= my_decimal_precision_to_length(length, decimals, fld_type_modifier & UNSIGNED_FLAG);
262
pack_length= my_decimal_get_binary_size(length, decimals);
251
length= class_decimal_precision_to_length(length, decimals, fld_type_modifier & UNSIGNED_FLAG);
252
pack_length= class_decimal_get_binary_size(length, decimals);
264
254
case DRIZZLE_TYPE_VARCHAR:
294
272
decimals != NOT_FIXED_DEC)
296
274
my_error(ER_M_BIGGER_THAN_D, MYF(0), fld_name);
278
case DRIZZLE_TYPE_MICROTIME:
280
This assert() should be correct due to absence of length
281
specifiers for timestamp. Previous manipulation also wasn't
282
ever called (from examining lcov)
300
285
case DRIZZLE_TYPE_TIMESTAMP:
303
length= DateTime::MAX_STRING_LENGTH;
306
/* This assert() should be correct due to absence of length
307
specifiers for timestamp. Previous manipulation also wasn't
308
ever called (from examining lcov)
310
assert(length == (uint32_t)DateTime::MAX_STRING_LENGTH);
312
flags|= UNSIGNED_FLAG;
313
if (fld_default_value)
315
/* Grammar allows only NOW() value for ON UPDATE clause */
316
if (fld_default_value->type() == Item::FUNC_ITEM &&
317
((Item_func*)fld_default_value)->functype() == Item_func::NOW_FUNC)
319
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_DNUN_FIELD:
320
Field::TIMESTAMP_DN_FIELD);
322
We don't need default value any longer moreover it is dangerous.
323
Everything handled by unireg_check further.
328
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_UN_FIELD:
334
If we have default TIMESTAMP NOT NULL column without explicit DEFAULT
335
or ON UPDATE values then for the sake of compatiblity we should treat
336
this column as having DEFAULT NOW() ON UPDATE NOW() (when we don't
337
have another TIMESTAMP column with auto-set option before this one)
338
or DEFAULT 0 (in other cases).
339
So here we are setting TIMESTAMP_OLD_FIELD only temporary, and will
340
replace this value by TIMESTAMP_DNUN_FIELD or NONE later when
341
information about all TIMESTAMP fields in table will be availiable.
343
If we have TIMESTAMP NULL column without explicit DEFAULT value
344
we treat it as having DEFAULT NULL attribute.
346
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_UN_FIELD :
347
(flags & NOT_NULL_FLAG ? Field::TIMESTAMP_OLD_FIELD :
286
length= MicroTimestamp::MAX_STRING_LENGTH;
351
288
case DRIZZLE_TYPE_DATE:
352
289
length= Date::MAX_STRING_LENGTH;
354
291
case DRIZZLE_TYPE_UUID:
355
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();
357
300
case DRIZZLE_TYPE_DATETIME:
358
301
length= DateTime::MAX_STRING_LENGTH;
303
case DRIZZLE_TYPE_TIME:
304
length= DateTime::MAX_STRING_LENGTH;
360
306
case DRIZZLE_TYPE_ENUM:
362
308
/* Should be safe. */
365
List_iterator<String> it(*fld_interval_list);
311
List<String>::iterator it(fld_interval_list->begin());
312
while (String* tmp= it++)
368
313
interval_list.push_back(tmp);
376
321
if (!(flags & BLOB_FLAG) &&
377
322
((length > max_field_charlength &&
378
fld_type != DRIZZLE_TYPE_ENUM &&
379
(fld_type != DRIZZLE_TYPE_VARCHAR || fld_default_value)) ||
323
fld_type != DRIZZLE_TYPE_ENUM &&
324
(fld_type != DRIZZLE_TYPE_VARCHAR)) ||
380
325
(!length && fld_type != DRIZZLE_TYPE_VARCHAR)))
382
327
my_error((fld_type == DRIZZLE_TYPE_VARCHAR) ? ER_TOO_BIG_FIELDLENGTH : ER_TOO_BIG_DISPLAYWIDTH,
384
fld_name, max_field_charlength);
329
fld_name, max_field_charlength / (charset? charset->mbmaxlen : 1));
387
332
fld_type_modifier&= AUTO_INCREMENT_FLAG;
394
339
return false; /* success */
342
bool CreateField::setDefaultValue(Item *default_value_item,
343
Item *on_update_item)
345
def= default_value_item;
348
Set NO_DEFAULT_VALUE_FLAG if this field doesn't have a default value and
349
it is NOT NULL, not an AUTO_INCREMENT field and not a TIMESTAMP.
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)
366
/* Allow empty as default value. */
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)
385
/* Grammar allows only NOW() value for ON UPDATE clause */
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);
392
We don't need default value any longer moreover it is dangerous.
393
Everything handled by unireg_check further.
399
unireg_check= on_update_now ? Field::TIMESTAMP_UN_FIELD : Field::NONE;
405
If we have default TIMESTAMP NOT NULL column without explicit DEFAULT
406
or ON UPDATE values then for the sake of compatiblity we should treat
407
this column as having DEFAULT NOW() ON UPDATE NOW() (when we don't
408
have another TIMESTAMP column with auto-set option before this one)
409
or DEFAULT 0 (in other cases).
410
So here we are setting TIMESTAMP_OLD_FIELD only temporary, and will
411
replace this value by TIMESTAMP_DNUN_FIELD or NONE later when
412
information about all TIMESTAMP fields in table will be availiable.
414
If we have TIMESTAMP NULL column without explicit DEFAULT value
415
we treat it as having DEFAULT NULL attribute.
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;
458
return output; // for multiple << operators.
397
461
} /* namespace drizzled */