24
24
gives much more speed.
29
28
#include <drizzled/error.h>
30
29
#include <drizzled/table.h>
31
30
#include <drizzled/session.h>
32
#include <drizzled/current_session.h>
34
#include <drizzled/copy_field.h>
32
#include <drizzled/field/str.h>
33
#include <drizzled/field/num.h>
35
34
#include <drizzled/field/blob.h>
35
#include <drizzled/field/enum.h>
36
#include <drizzled/field/null.h>
36
37
#include <drizzled/field/date.h>
37
#include <drizzled/field/datetime.h>
38
38
#include <drizzled/field/decimal.h>
39
#include <drizzled/field/real.h>
39
40
#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>
41
#include <drizzled/field/long.h>
42
#include <drizzled/field/int64_t.h>
43
#include <drizzled/field/num.h>
44
#include <drizzled/field/timestamp.h>
45
#include <drizzled/field/datetime.h>
49
46
#include <drizzled/field/varstring.h>
192
188
when set to NULL (TIMESTAMP fields which allow setting to NULL
193
189
are handled by first check).
195
if (field->is_timestamp())
191
if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
197
((field::Epoch::pointer) field)->set_time();
193
((Field_timestamp*) field)->set_time();
198
194
return 0; // Ok to set time to NULL
202
197
if (field == field->getTable()->next_number_field)
204
199
field->getTable()->auto_increment_field_not_null= false;
205
200
return 0; // field is set in fill_record()
208
202
if (field->getTable()->in_use->count_cuted_fields == CHECK_FIELD_WARN)
210
204
field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_BAD_NULL_ERROR, 1);
214
207
if (!field->getTable()->in_use->no_errors)
215
208
my_error(ER_BAD_NULL_ERROR, MYF(0), field->field_name);
387
375
static void do_cut_string(CopyField *copy)
389
377
const CHARSET_INFO * const cs= copy->from_field->charset();
390
memcpy(copy->to_ptr, copy->from_ptr, copy->to_length);
378
memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
392
380
/* Check if we loosed any important characters */
393
381
if (cs->cset->scan(cs,
465
453
length= copy->to_length - 1;
466
454
if (copy->from_field->getTable()->in_use->count_cuted_fields)
468
455
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
469
456
ER_WARN_DATA_TRUNCATED, 1);
472
458
*(unsigned char*) copy->to_ptr= (unsigned char) length;
473
459
memcpy(copy->to_ptr+1, copy->from_ptr + 1, length);
487
473
if (length < from_length)
489
475
if (current_session->count_cuted_fields)
491
476
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
492
477
ER_WARN_DATA_TRUNCATED, 1);
495
479
*copy->to_ptr= (unsigned char) length;
496
480
memcpy(copy->to_ptr + 1, from_ptr, length);
505
489
length=copy->to_length-HA_KEY_BLOB_LENGTH;
506
490
if (copy->from_field->getTable()->in_use->count_cuted_fields)
508
491
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
509
492
ER_WARN_DATA_TRUNCATED, 1);
512
494
int2store(copy->to_ptr,length);
513
495
memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, copy->from_ptr + HA_KEY_BLOB_LENGTH,
528
510
if (length < from_length)
530
512
if (current_session->count_cuted_fields)
532
513
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
533
514
ER_WARN_DATA_TRUNCATED, 1);
536
516
int2store(copy->to_ptr, length);
537
517
memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
675
655
if (from_length != to_length || !compatible_db_low_byte_first)
677
657
// Correct pointer to point at char pointer
678
to_ptr+= to_length - to->getTable()->getShare()->sizeBlobPtr();
679
from_ptr+= from_length- from->getTable()->getShare()->sizeBlobPtr();
658
to_ptr+= to_length - to->getTable()->getShare()->blob_ptr_size;
659
from_ptr+= from_length- from->getTable()->getShare()->blob_ptr_size;
680
660
return do_copy_blob;
723
703
else if (to->real_type() == DRIZZLE_TYPE_VARCHAR)
725
705
/* Field_blob is not part of the Field_varstring hierarchy,
726
and casting to varstring for calling pack_length_no_ptr()
727
is always incorrect. Previously the below comparison has
728
always evaluated to false as pack_length_no_ptr() for BLOB
729
will return 4 and varstring can only be <= 2.
730
If your brain slightly bleeds as to why this worked for
731
so many years, you are in no way alone.
706
and casting to varstring for calling pack_length_no_ptr()
707
is always incorrect. Previously the below comparison has
708
always evaluated to false as pack_length_no_ptr() for BLOB
709
will return 4 and varstring can only be <= 2.
710
If your brain slightly bleeds as to why this worked for
711
so many years, you are in no way alone.
733
713
if (from->flags & BLOB_FLAG)
734
714
return do_field_string;
739
719
return do_field_string;
742
722
if (to_length != from_length)
744
724
return (((Field_varstring*) to)->pack_length_no_ptr() == 1 ?
745
725
(from->charset()->mbmaxlen == 1 ? do_varstring1 :
747
727
(from->charset()->mbmaxlen == 1 ? do_varstring2 :
751
731
else if (to_length < from_length)
859
839
return to->store(result.c_ptr_quick(),result.length(),from->charset());
861
841
else if (from->result_type() == REAL_RESULT)
863
842
return to->store(from->val_real());
865
843
else if (from->result_type() == DECIMAL_RESULT)
868
846
return to->store_decimal(from->val_decimal(&buff));
872
849
return to->store(from->val_int(), test(from->flags & UNSIGNED_FLAG));
876
852
} /* namespace drizzled */