29 #include <drizzled/error.h>
30 #include <drizzled/table.h>
31 #include <drizzled/session.h>
32 #include <drizzled/current_session.h>
34 #include <drizzled/copy_field.h>
35 #include <drizzled/field/blob.h>
36 #include <drizzled/field/date.h>
37 #include <drizzled/field/datetime.h>
38 #include <drizzled/field/decimal.h>
39 #include <drizzled/field/double.h>
40 #include <drizzled/field/enum.h>
41 #include <drizzled/field/epoch.h>
42 #include <drizzled/field/int32.h>
43 #include <drizzled/field/int64.h>
44 #include <drizzled/field/null.h>
45 #include <drizzled/field/num.h>
46 #include <drizzled/field/num.h>
47 #include <drizzled/field/real.h>
48 #include <drizzled/field/str.h>
49 #include <drizzled/field/varstring.h>
50 #include <drizzled/util/test.h>
51 #include <drizzled/system_variables.h>
55 static void do_field_eq(CopyField *copy)
57 memcpy(copy->to_ptr, copy->from_ptr, copy->from_length);
60 static void do_field_1(CopyField *copy)
62 copy->to_ptr[0]= copy->from_ptr[0];
65 static void do_field_2(CopyField *copy)
67 copy->to_ptr[0]= copy->from_ptr[0];
68 copy->to_ptr[1]= copy->from_ptr[1];
71 static void do_field_3(CopyField *copy)
73 copy->to_ptr[0]= copy->from_ptr[0];
74 copy->to_ptr[1]= copy->from_ptr[1];
75 copy->to_ptr[2]= copy->from_ptr[2];
78 static void do_field_4(CopyField *copy)
80 copy->to_ptr[0]= copy->from_ptr[0];
81 copy->to_ptr[1]= copy->from_ptr[1];
82 copy->to_ptr[2]= copy->from_ptr[2];
83 copy->to_ptr[3]= copy->from_ptr[3];
86 static void do_field_6(CopyField *copy)
88 copy->to_ptr[0]= copy->from_ptr[0];
89 copy->to_ptr[1]= copy->from_ptr[1];
90 copy->to_ptr[2]= copy->from_ptr[2];
91 copy->to_ptr[3]= copy->from_ptr[3];
92 copy->to_ptr[4]= copy->from_ptr[4];
93 copy->to_ptr[5]= copy->from_ptr[5];
96 static void do_field_8(CopyField *copy)
98 copy->to_ptr[0]= copy->from_ptr[0];
99 copy->to_ptr[1]= copy->from_ptr[1];
100 copy->to_ptr[2]= copy->from_ptr[2];
101 copy->to_ptr[3]= copy->from_ptr[3];
102 copy->to_ptr[4]= copy->from_ptr[4];
103 copy->to_ptr[5]= copy->from_ptr[5];
104 copy->to_ptr[6]= copy->from_ptr[6];
105 copy->to_ptr[7]= copy->from_ptr[7];
109 static void do_field_to_null_str(CopyField *copy)
111 if (*copy->from_null_ptr & copy->from_bit)
113 memset(copy->to_ptr, 0, copy->from_length);
114 copy->to_null_ptr[0]= 1;
118 copy->to_null_ptr[0]= 0;
119 memcpy(copy->to_ptr, copy->from_ptr, copy->from_length);
124 static void do_outer_field_to_null_str(CopyField *copy)
126 if (*copy->null_row ||
127 (copy->from_null_ptr && (*copy->from_null_ptr & copy->from_bit)))
129 memset(copy->to_ptr, 0, copy->from_length);
130 copy->to_null_ptr[0]= 1;
134 copy->to_null_ptr[0]= 0;
135 memcpy(copy->to_ptr, copy->from_ptr, copy->from_length);
141 set_field_to_null(Field *field)
143 if (field->real_maybe_null())
150 if (field->getTable()->in_use->count_cuted_fields == CHECK_FIELD_WARN)
152 field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
155 if (!field->getTable()->in_use->no_errors)
156 my_error(ER_BAD_NULL_ERROR, MYF(0), field->field_name);
181 if (field->real_maybe_null())
196 if (field->is_timestamp())
205 field->getTable()->auto_increment_field_not_null=
false;
209 if (field->getTable()->
in_use->count_cuted_fields == CHECK_FIELD_WARN)
211 field->
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_BAD_NULL_ERROR, 1);
215 if (!field->getTable()->
in_use->no_errors)
216 my_error(ER_BAD_NULL_ERROR, MYF(0), field->
field_name);
222 static void do_skip(CopyField *)
227 static void do_copy_null(CopyField *copy)
229 if (*copy->from_null_ptr & copy->from_bit)
231 *copy->to_null_ptr|= copy->to_bit;
232 copy->to_field->reset();
236 *copy->to_null_ptr&= ~copy->to_bit;
237 (copy->do_copy2)(copy);
242 static void do_outer_field_null(CopyField *copy)
244 if (*copy->null_row ||
245 (copy->from_null_ptr && (*copy->from_null_ptr & copy->from_bit)))
247 *copy->to_null_ptr|=copy->to_bit;
248 copy->to_field->reset();
252 *copy->to_null_ptr&= ~copy->to_bit;
253 (copy->do_copy2)(copy);
258 static void do_copy_not_null(CopyField *copy)
260 if (copy->to_field->hasDefault() and *copy->from_null_ptr & copy->from_bit)
262 copy->to_field->set_default();
264 else if (*copy->from_null_ptr & copy->from_bit)
266 copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
267 ER_WARN_DATA_TRUNCATED, 1);
268 copy->to_field->reset();
272 (copy->do_copy2)(copy);
277 static void do_copy_maybe_null(CopyField *copy)
279 *copy->to_null_ptr&= ~copy->to_bit;
280 (copy->do_copy2)(copy);
285 static void do_copy_timestamp(CopyField *copy)
287 if (*copy->from_null_ptr & copy->from_bit)
290 ((field::Epoch::pointer) copy->to_field)->set_time();
294 (copy->do_copy2)(copy);
299 static void do_copy_next_number(CopyField *copy)
301 if (*copy->from_null_ptr & copy->from_bit)
304 copy->to_field->getTable()->auto_increment_field_not_null=
false;
305 copy->to_field->reset();
309 (copy->do_copy2)(copy);
314 static void do_copy_blob(CopyField *copy)
316 ulong length= ((Field_blob*) copy->from_field)->get_length();
317 ((Field_blob*) copy->to_field)->store_length(length);
318 memcpy(copy->to_ptr, copy->from_ptr,
sizeof(
char*));
321 static void do_conv_blob(CopyField *copy)
323 copy->from_field->val_str_internal(©->tmp);
324 ((Field_blob *) copy->to_field)->store(copy->tmp.ptr(),
326 copy->tmp.charset());
333 char buff[MAX_FIELD_WIDTH];
334 String res(buff,
sizeof(buff), copy->tmp.charset());
335 copy->from_field->val_str_internal(&res);
337 ((
Field_blob *) copy->to_field)->store(copy->tmp.ptr(),
339 copy->tmp.charset());
343 static void do_field_string(CopyField *copy)
345 char buff[MAX_FIELD_WIDTH];
346 copy->tmp.set_quick(buff,
sizeof(buff),copy->tmp.charset());
347 copy->from_field->val_str_internal(©->tmp);
348 copy->to_field->store(copy->tmp.data(),copy->tmp.length(), copy->tmp.charset());
352 static void do_field_enum(CopyField *copy)
354 if (copy->from_field->val_int() == 0)
355 ((Field_enum *) copy->to_field)->store_type((uint64_t) 0);
357 do_field_string(copy);
361 static void do_field_int(CopyField *copy)
363 int64_t value= copy->from_field->val_int();
364 copy->to_field->store(value,
365 test(copy->from_field->flags & UNSIGNED_FLAG));
368 static void do_field_real(CopyField *copy)
370 double value=copy->from_field->val_real();
371 copy->to_field->store(value);
375 static void do_field_decimal(CopyField *copy)
378 copy->to_field->store_decimal(copy->from_field->val_decimal(&value));
390 memcpy(copy->to_ptr, copy->from_ptr, copy->to_length);
393 if (cs->cset->scan(cs,
394 (
char*) copy->from_ptr + copy->to_length,
395 (
char*) copy->from_ptr + copy->from_length,
396 MY_SEQ_SPACES) < copy->from_length - copy->to_length)
398 copy->to_field->
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
399 ER_WARN_DATA_TRUNCATED, 1);
411 int well_formed_error;
413 const unsigned char *from_end= copy->from_ptr + copy->from_length;
414 uint32_t copy_length= cs->cset->well_formed_len(*cs,
str_ref(copy->from_ptr, from_end), copy->to_length / cs->mbmaxlen, &well_formed_error);
415 if (copy->to_length < copy_length)
416 copy_length= copy->to_length;
417 memcpy(copy->to_ptr, copy->from_ptr, copy_length);
420 if (well_formed_error ||
421 cs->cset->scan(cs, (
char*) copy->from_ptr + copy_length,
423 MY_SEQ_SPACES) < (copy->from_length - copy_length))
425 copy->to_field->
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
426 ER_WARN_DATA_TRUNCATED, 1);
429 if (copy_length < copy->to_length)
430 cs->cset->fill(cs, (
char*) copy->to_ptr + copy_length,
431 copy->to_length - copy_length,
' ');
437 static void do_expand_binary(CopyField *copy)
439 const charset_info_st *
const cs= copy->from_field->charset();
440 memcpy(copy->to_ptr, copy->from_ptr, copy->from_length);
441 cs->cset->fill(cs, (
char*) copy->to_ptr+copy->from_length,
442 copy->to_length-copy->from_length,
'\0');
447 static void do_expand_string(CopyField *copy)
449 const charset_info_st *
const cs= copy->from_field->charset();
450 memcpy(copy->to_ptr,copy->from_ptr,copy->from_length);
451 cs->cset->fill(cs, (
char*) copy->to_ptr+copy->from_length,
452 copy->to_length-copy->from_length,
' ');
456 static void do_varstring1(CopyField *copy)
458 uint32_t length= (uint32_t) *(
unsigned char*) copy->from_ptr;
459 if (length > copy->to_length- 1)
461 length= copy->to_length - 1;
462 if (copy->from_field->getTable()->in_use->count_cuted_fields)
464 copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
465 ER_WARN_DATA_TRUNCATED, 1);
468 *(
unsigned char*) copy->to_ptr= (
unsigned char) length;
469 memcpy(copy->to_ptr+1, copy->from_ptr + 1, length);
473 static void do_varstring1_mb(CopyField *copy)
475 int well_formed_error;
476 const charset_info_st *
const cs= copy->from_field->charset();
477 uint32_t from_length= (uint32_t) *(
unsigned char*) copy->from_ptr;
478 const unsigned char *from_ptr= copy->from_ptr + 1;
479 uint32_t to_char_length= (copy->to_length - 1) / cs->mbmaxlen;
480 uint32_t length= cs->cset->well_formed_len(*cs,
str_ref(from_ptr, from_length), to_char_length, &well_formed_error);
481 if (length < from_length)
483 if (current_session->count_cuted_fields)
485 copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
488 *copy->to_ptr= (
unsigned char) length;
489 memcpy(copy->to_ptr + 1, from_ptr, length);
493 static void do_varstring2(CopyField *copy)
495 uint32_t length= uint2korr(copy->from_ptr);
496 if (length > copy->to_length- HA_KEY_BLOB_LENGTH)
498 length=copy->to_length-HA_KEY_BLOB_LENGTH;
499 if (copy->from_field->getTable()->in_use->count_cuted_fields)
501 copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
502 ER_WARN_DATA_TRUNCATED, 1);
505 int2store(copy->to_ptr,length);
506 memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, copy->from_ptr + HA_KEY_BLOB_LENGTH,
511 static void do_varstring2_mb(CopyField *copy)
513 int well_formed_error;
514 const charset_info_st *
const cs= copy->from_field->charset();
515 uint32_t char_length= (copy->to_length - HA_KEY_BLOB_LENGTH) / cs->mbmaxlen;
516 uint32_t from_length= uint2korr(copy->from_ptr);
517 const unsigned char *from_beg= copy->from_ptr + HA_KEY_BLOB_LENGTH;
518 uint32_t length= cs->cset->well_formed_len(*cs,
str_ref(from_beg, from_length), char_length, &well_formed_error);
519 if (length < from_length)
521 if (current_session->count_cuted_fields)
523 copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
524 ER_WARN_DATA_TRUNCATED, 1);
527 int2store(copy->to_ptr, length);
528 memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
544 void CopyField::set(
unsigned char *to,
Field *from)
549 if (from->maybe_null())
554 to_null_ptr= (
unsigned char*) to_ptr++;
556 if (from->getTable()->maybe_null)
558 null_row= &from->getTable()->null_row;
559 do_copy= do_outer_field_to_null_str;
562 do_copy= do_field_to_null_str;
567 do_copy= do_field_eq;
587 void CopyField::set(
Field *to,
Field *from,
bool save)
589 if (to->type() == DRIZZLE_TYPE_NULL)
604 from_null_ptr= to_null_ptr= 0;
605 if (from->maybe_null())
609 if (to_field->real_maybe_null())
615 do_copy= do_copy_null;
619 null_row= &from->getTable()->null_row;
620 do_copy= do_outer_field_null;
625 if (to_field->is_timestamp())
627 do_copy= do_copy_timestamp;
631 do_copy= do_copy_next_number;
635 do_copy= do_copy_not_null;
639 else if (to_field->real_maybe_null())
643 do_copy= do_copy_maybe_null;
648 if ((to->flags & BLOB_FLAG) && save)
651 do_copy2= get_copy_func(to,from);
658 CopyField::get_copy_func(Field *to,Field *from)
660 bool compatible_db_low_byte_first= (to->getTable()->getShare()->db_low_byte_first ==
661 from->getTable()->getShare()->db_low_byte_first);
662 if (to->flags & BLOB_FLAG)
664 if (!(from->flags & BLOB_FLAG) || from->charset() != to->charset())
666 if (from_length != to_length || !compatible_db_low_byte_first)
669 to_ptr+= to_length - to->getTable()->getShare()->sizeBlobPtr();
670 from_ptr+= from_length- from->getTable()->getShare()->sizeBlobPtr();
676 if (to->result_type() == DECIMAL_RESULT)
677 return do_field_decimal;
680 if (from->result_type() == STRING_RESULT)
686 if (to->real_type() != from->real_type() ||
687 !compatible_db_low_byte_first ||
688 (((to->getTable()->in_use->variables.sql_mode & (MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) && to->type() == DRIZZLE_TYPE_DATE) || to->type() == DRIZZLE_TYPE_DATETIME))
690 if (from->real_type() == DRIZZLE_TYPE_ENUM)
692 if (to->result_type() != STRING_RESULT)
697 return do_field_string;
701 if (to->real_type() == DRIZZLE_TYPE_ENUM)
703 if (!to->eq_def(from))
705 if (from->real_type() == DRIZZLE_TYPE_ENUM &&
706 to->real_type() == DRIZZLE_TYPE_ENUM)
707 return do_field_enum;
709 return do_field_string;
712 else if (to->charset() != from->charset())
713 return do_field_string;
714 else if (to->real_type() == DRIZZLE_TYPE_VARCHAR)
724 if (from->flags & BLOB_FLAG)
725 return do_field_string;
727 if ((static_cast<Field_varstring*>(to))->pack_length_no_ptr() !=
728 (
static_cast<Field_varstring*
>(from))->pack_length_no_ptr())
730 return do_field_string;
733 if (to_length != from_length)
735 return (((Field_varstring*) to)->pack_length_no_ptr() == 1 ?
736 (from->charset()->mbmaxlen == 1 ? do_varstring1 :
738 (from->charset()->mbmaxlen == 1 ? do_varstring2 :
742 else if (to_length < from_length)
744 return (from->charset()->mbmaxlen == 1 ?
747 else if (to_length > from_length)
749 if (to->charset() == &my_charset_bin)
750 return do_expand_binary;
752 return do_expand_string;
755 else if (to->real_type() != from->real_type() ||
756 to_length != from_length ||
757 !compatible_db_low_byte_first)
759 if (to->result_type() == STRING_RESULT)
760 return do_field_string;
761 if (to->result_type() == INT_RESULT)
764 return do_field_real;
768 if (!to->eq_def(from) || !compatible_db_low_byte_first)
770 if (to->result_type() == INT_RESULT)
773 return do_field_real;
781 case 1:
return do_field_1;
782 case 2:
return do_field_2;
783 case 3:
return do_field_3;
784 case 4:
return do_field_4;
785 case 6:
return do_field_6;
786 case 8:
return do_field_8;
797 if (to->real_type() == from->real_type() &&
798 !(to->type() == DRIZZLE_TYPE_BLOB && to->getTable()->
copy_blobs))
802 !(to->flags & UNSIGNED_FLAG && !(from->flags & UNSIGNED_FLAG)) &&
803 to->real_type() != DRIZZLE_TYPE_ENUM &&
805 from->charset() == to->charset() &&
806 to->getTable()->getShare()->db_low_byte_first == from->getTable()->getShare()->db_low_byte_first &&
807 (!(to->getTable()->
in_use->
variables.sql_mode & (MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) || (to->type() != DRIZZLE_TYPE_DATE && to->type() != DRIZZLE_TYPE_DATETIME)) &&
816 if (to->type() == DRIZZLE_TYPE_BLOB)
819 from->val_str_internal(&blob->value);
825 (!blob->value.is_alloced() &&
826 from->real_type() != DRIZZLE_TYPE_VARCHAR))
828 return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
830 if (from->real_type() == DRIZZLE_TYPE_ENUM &&
831 to->real_type() == DRIZZLE_TYPE_ENUM &&
832 from->val_int() == 0)
837 else if ((from->result_type() == STRING_RESULT &&
838 (to->result_type() == STRING_RESULT ||
839 (from->real_type() != DRIZZLE_TYPE_ENUM))))
841 char buff[MAX_FIELD_WIDTH];
842 String result(buff,
sizeof(buff),from->charset());
843 from->val_str_internal(&result);
850 return to->store(result.c_str(),result.length(),from->charset());
852 else if (from->result_type() == REAL_RESULT)
854 return to->store(from->val_real());
856 else if (from->result_type() == DECIMAL_RESULT)
859 return to->store_decimal(from->val_decimal(&buff));
863 return to->store(from->val_int(), test(from->flags & UNSIGNED_FLAG));