24
24
gives much more speed.
28
29
#include <drizzled/error.h>
29
30
#include <drizzled/table.h>
30
31
#include <drizzled/session.h>
32
#include <drizzled/current_session.h>
32
#include <drizzled/field/str.h>
33
#include <drizzled/field/num.h>
34
#include <drizzled/copy_field.h>
34
35
#include <drizzled/field/blob.h>
35
#include <drizzled/field/enum.h>
36
#include <drizzled/field/null.h>
37
36
#include <drizzled/field/date.h>
37
#include <drizzled/field/datetime.h>
38
38
#include <drizzled/field/decimal.h>
39
#include <drizzled/field/real.h>
40
39
#include <drizzled/field/double.h>
40
#include <drizzled/field/enum.h>
41
#include <drizzled/field/epoch.h>
41
42
#include <drizzled/field/int32.h>
42
43
#include <drizzled/field/int64.h>
43
#include <drizzled/field/num.h>
44
#include <drizzled/field/timestamp.h>
45
#include <drizzled/field/datetime.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>
46
49
#include <drizzled/field/varstring.h>
50
#include <drizzled/util/test.h>
51
#include <drizzled/system_variables.h>
51
55
static void do_field_eq(CopyField *copy)
188
193
when set to NULL (TIMESTAMP fields which allow setting to NULL
189
194
are handled by first check).
191
if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
196
if (field->is_timestamp())
193
((Field_timestamp*) field)->set_time();
198
((field::Epoch::pointer) field)->set_time();
194
199
return 0; // Ok to set time to NULL
197
203
if (field == field->getTable()->next_number_field)
199
205
field->getTable()->auto_increment_field_not_null= false;
200
206
return 0; // field is set in fill_record()
202
209
if (field->getTable()->in_use->count_cuted_fields == CHECK_FIELD_WARN)
204
211
field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_BAD_NULL_ERROR, 1);
207
215
if (!field->getTable()->in_use->no_errors)
208
216
my_error(ER_BAD_NULL_ERROR, MYF(0), field->field_name);
375
388
static void do_cut_string(CopyField *copy)
377
const CHARSET_INFO * const cs= copy->from_field->charset();
378
memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
390
const charset_info_st * const cs= copy->from_field->charset();
391
memcpy(copy->to_ptr, copy->from_ptr, copy->to_length);
380
393
/* Check if we loosed any important characters */
381
394
if (cs->cset->scan(cs,
397
410
static void do_cut_string_complex(CopyField *copy)
398
411
{ // Shorter string field
399
412
int well_formed_error;
400
const CHARSET_INFO * const cs= copy->from_field->charset();
413
const charset_info_st * const cs= copy->from_field->charset();
401
414
const unsigned char *from_end= copy->from_ptr + copy->from_length;
402
415
uint32_t copy_length= cs->cset->well_formed_len(cs,
403
416
(char*) copy->from_ptr,
429
442
static void do_expand_binary(CopyField *copy)
431
const CHARSET_INFO * const cs= copy->from_field->charset();
444
const charset_info_st * const cs= copy->from_field->charset();
432
445
memcpy(copy->to_ptr, copy->from_ptr, copy->from_length);
433
446
cs->cset->fill(cs, (char*) copy->to_ptr+copy->from_length,
434
447
copy->to_length-copy->from_length, '\0');
439
452
static void do_expand_string(CopyField *copy)
441
const CHARSET_INFO * const cs= copy->from_field->charset();
454
const charset_info_st * const cs= copy->from_field->charset();
442
455
memcpy(copy->to_ptr,copy->from_ptr,copy->from_length);
443
456
cs->cset->fill(cs, (char*) copy->to_ptr+copy->from_length,
444
457
copy->to_length-copy->from_length, ' ');
453
466
length= copy->to_length - 1;
454
467
if (copy->from_field->getTable()->in_use->count_cuted_fields)
455
469
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
456
470
ER_WARN_DATA_TRUNCATED, 1);
458
473
*(unsigned char*) copy->to_ptr= (unsigned char) length;
459
474
memcpy(copy->to_ptr+1, copy->from_ptr + 1, length);
463
478
static void do_varstring1_mb(CopyField *copy)
465
480
int well_formed_error;
466
const CHARSET_INFO * const cs= copy->from_field->charset();
481
const charset_info_st * const cs= copy->from_field->charset();
467
482
uint32_t from_length= (uint32_t) *(unsigned char*) copy->from_ptr;
468
483
const unsigned char *from_ptr= copy->from_ptr + 1;
469
484
uint32_t to_char_length= (copy->to_length - 1) / cs->mbmaxlen;
473
488
if (length < from_length)
475
490
if (current_session->count_cuted_fields)
476
492
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
477
493
ER_WARN_DATA_TRUNCATED, 1);
479
496
*copy->to_ptr= (unsigned char) length;
480
497
memcpy(copy->to_ptr + 1, from_ptr, length);
489
506
length=copy->to_length-HA_KEY_BLOB_LENGTH;
490
507
if (copy->from_field->getTable()->in_use->count_cuted_fields)
491
509
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
492
510
ER_WARN_DATA_TRUNCATED, 1);
494
513
int2store(copy->to_ptr,length);
495
514
memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, copy->from_ptr + HA_KEY_BLOB_LENGTH,
500
519
static void do_varstring2_mb(CopyField *copy)
502
521
int well_formed_error;
503
const CHARSET_INFO * const cs= copy->from_field->charset();
522
const charset_info_st * const cs= copy->from_field->charset();
504
523
uint32_t char_length= (copy->to_length - HA_KEY_BLOB_LENGTH) / cs->mbmaxlen;
505
524
uint32_t from_length= uint2korr(copy->from_ptr);
506
525
const unsigned char *from_beg= copy->from_ptr + HA_KEY_BLOB_LENGTH;
510
529
if (length < from_length)
512
531
if (current_session->count_cuted_fields)
513
533
copy->to_field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
514
534
ER_WARN_DATA_TRUNCATED, 1);
516
537
int2store(copy->to_ptr, length);
517
538
memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
655
676
if (from_length != to_length || !compatible_db_low_byte_first)
657
678
// Correct pointer to point at char pointer
658
to_ptr+= to_length - to->getTable()->getShare()->blob_ptr_size;
659
from_ptr+= from_length- from->getTable()->getShare()->blob_ptr_size;
679
to_ptr+= to_length - to->getTable()->getShare()->sizeBlobPtr();
680
from_ptr+= from_length- from->getTable()->getShare()->sizeBlobPtr();
660
681
return do_copy_blob;
839
860
return to->store(result.c_ptr_quick(),result.length(),from->charset());
841
862
else if (from->result_type() == REAL_RESULT)
842
864
return to->store(from->val_real());
843
866
else if (from->result_type() == DECIMAL_RESULT)
846
869
return to->store_decimal(from->val_decimal(&buff));
849
873
return to->store(from->val_int(), test(from->flags & UNSIGNED_FLAG));
852
877
} /* namespace drizzled */