~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field_conv.cc

Merged build changes from Antony.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
*/
26
26
 
27
27
#include "mysql_priv.h"
28
 
#include <m_ctype.h>
29
28
 
30
29
static void do_field_eq(Copy_field *copy)
31
30
{
85
84
{
86
85
  if (*copy->from_null_ptr & copy->from_bit)
87
86
  {
88
 
    bzero(copy->to_ptr,copy->from_length);
 
87
    memset(copy->to_ptr, 0, copy->from_length);
89
88
    copy->to_null_ptr[0]=1;                     // Always bit 1
90
89
  }
91
90
  else
101
100
  if (*copy->null_row ||
102
101
      (copy->from_null_ptr && (*copy->from_null_ptr & copy->from_bit)))
103
102
  {
104
 
    bzero(copy->to_ptr,copy->from_length);
 
103
    memset(copy->to_ptr, 0, copy->from_length);
105
104
    copy->to_null_ptr[0]=1;                     // Always bit 1
106
105
  }
107
106
  else
124
123
  field->reset();
125
124
  if (field->table->in_use->count_cuted_fields == CHECK_FIELD_WARN)
126
125
  {
127
 
    field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
 
126
    field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
128
127
    return 0;
129
128
  }
130
129
  if (!field->table->in_use->no_errors)
167
166
    when set to NULL (TIMESTAMP fields which allow setting to NULL
168
167
    are handled by first check).
169
168
  */
170
 
  if (field->type() == MYSQL_TYPE_TIMESTAMP)
 
169
  if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
171
170
  {
172
171
    ((Field_timestamp*) field)->set_time();
173
172
    return 0;                                   // Ok to set time to NULL
230
229
  if (*copy->from_null_ptr & copy->from_bit)
231
230
  {
232
231
    copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
233
 
                                WARN_DATA_TRUNCATED, 1);
 
232
                                ER_WARN_DATA_TRUNCATED, 1);
234
233
    copy->to_field->reset();
235
234
  }
236
235
  else
275
274
{
276
275
  ulong length=((Field_blob*) copy->from_field)->get_length();
277
276
  ((Field_blob*) copy->to_field)->store_length(length);
278
 
  memcpy_fixed(copy->to_ptr,copy->from_ptr,sizeof(char*));
 
277
  memcpy(copy->to_ptr,copy->from_ptr,sizeof(char*));
279
278
}
280
279
 
281
280
static void do_conv_blob(Copy_field *copy)
372
371
                     MY_SEQ_SPACES) < copy->from_length - copy->to_length)
373
372
  {
374
373
    copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
375
 
                                WARN_DATA_TRUNCATED, 1);
 
374
                                ER_WARN_DATA_TRUNCATED, 1);
376
375
  }
377
376
}
378
377
 
403
402
                     MY_SEQ_SPACES) < (copy->from_length - copy_length))
404
403
  {
405
404
    copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
406
 
                                WARN_DATA_TRUNCATED, 1);
 
405
                                ER_WARN_DATA_TRUNCATED, 1);
407
406
  }
408
407
 
409
408
  if (copy_length < copy->to_length)
441
440
    length=copy->to_length - 1;
442
441
    if (copy->from_field->table->in_use->count_cuted_fields)
443
442
      copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
444
 
                                  WARN_DATA_TRUNCATED, 1);
 
443
                                  ER_WARN_DATA_TRUNCATED, 1);
445
444
  }
446
445
  *(uchar*) copy->to_ptr= (uchar) length;
447
446
  memcpy(copy->to_ptr+1, copy->from_ptr + 1, length);
462
461
  {
463
462
    if (current_thd->count_cuted_fields)
464
463
      copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
465
 
                                  WARN_DATA_TRUNCATED, 1);
 
464
                                  ER_WARN_DATA_TRUNCATED, 1);
466
465
  }
467
466
  *copy->to_ptr= (uchar) length;
468
467
  memcpy(copy->to_ptr + 1, from_ptr, length);
477
476
    length=copy->to_length-HA_KEY_BLOB_LENGTH;
478
477
    if (copy->from_field->table->in_use->count_cuted_fields)
479
478
      copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
480
 
                                  WARN_DATA_TRUNCATED, 1);
 
479
                                  ER_WARN_DATA_TRUNCATED, 1);
481
480
  }
482
481
  int2store(copy->to_ptr,length);
483
482
  memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, copy->from_ptr + HA_KEY_BLOB_LENGTH,
499
498
  {
500
499
    if (current_thd->count_cuted_fields)
501
500
      copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
502
 
                                  WARN_DATA_TRUNCATED, 1);
 
501
                                  ER_WARN_DATA_TRUNCATED, 1);
503
502
  }  
504
503
  int2store(copy->to_ptr, length);
505
504
  memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
563
562
 */
564
563
void Copy_field::set(Field *to,Field *from,bool save)
565
564
{
566
 
  if (to->type() == MYSQL_TYPE_NULL)
 
565
  if (to->type() == DRIZZLE_TYPE_NULL)
567
566
  {
568
567
    to_null_ptr=0;                              // For easy debugging
569
568
    to_ptr=0;
597
596
    }
598
597
    else
599
598
    {
600
 
      if (to_field->type() == MYSQL_TYPE_TIMESTAMP)
 
599
      if (to_field->type() == DRIZZLE_TYPE_TIMESTAMP)
601
600
        do_copy= do_copy_timestamp;               // Automatic timestamp
602
601
      else if (to_field == to_field->table->next_number_field)
603
602
        do_copy= do_copy_next_number;
652
651
        use special copy function that removes trailing spaces and thus
653
652
        repairs data.
654
653
      */
655
 
      if (from->type() == MYSQL_TYPE_VAR_STRING && !from->has_charset() &&
656
 
          to->type() == MYSQL_TYPE_VARCHAR && !to->has_charset())
 
654
      if (from->type() == DRIZZLE_TYPE_VAR_STRING && !from->has_charset() &&
 
655
          to->type() == DRIZZLE_TYPE_VARCHAR && !to->has_charset())
657
656
        return do_field_varbinary_pre50;
658
657
 
659
658
      /*
662
661
      */
663
662
      if (to->real_type() != from->real_type() ||
664
663
          !compatible_db_low_byte_first ||
665
 
          (((to->table->in_use->variables.sql_mode & (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) && to->type() == MYSQL_TYPE_NEWDATE) || to->type() == MYSQL_TYPE_DATETIME))
 
664
          (((to->table->in_use->variables.sql_mode & (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) && to->type() == DRIZZLE_TYPE_NEWDATE) || to->type() == DRIZZLE_TYPE_DATETIME))
666
665
      {
667
 
        if (from->real_type() == MYSQL_TYPE_ENUM ||
668
 
            from->real_type() == MYSQL_TYPE_SET)
 
666
        if (from->real_type() == DRIZZLE_TYPE_ENUM ||
 
667
            from->real_type() == DRIZZLE_TYPE_SET)
669
668
          if (to->result_type() != STRING_RESULT)
670
669
            return do_field_int;                // Convert SET to number
671
670
        return do_field_string;
672
671
      }
673
 
      if (to->real_type() == MYSQL_TYPE_ENUM ||
674
 
          to->real_type() == MYSQL_TYPE_SET)
 
672
      if (to->real_type() == DRIZZLE_TYPE_ENUM ||
 
673
          to->real_type() == DRIZZLE_TYPE_SET)
675
674
      {
676
675
        if (!to->eq_def(from))
677
676
        {
678
 
          if (from->real_type() == MYSQL_TYPE_ENUM &&
679
 
              to->real_type() == MYSQL_TYPE_ENUM)
 
677
          if (from->real_type() == DRIZZLE_TYPE_ENUM &&
 
678
              to->real_type() == DRIZZLE_TYPE_ENUM)
680
679
            return do_field_enum;
681
680
          else
682
681
            return do_field_string;
684
683
      }
685
684
      else if (to->charset() != from->charset())
686
685
        return do_field_string;
687
 
      else if (to->real_type() == MYSQL_TYPE_VARCHAR)
 
686
      else if (to->real_type() == DRIZZLE_TYPE_VARCHAR)
688
687
      {
689
688
        if (((Field_varstring*) to)->length_bytes !=
690
689
            ((Field_varstring*) from)->length_bytes)
747
746
int field_conv(Field *to,Field *from)
748
747
{
749
748
  if (to->real_type() == from->real_type() &&
750
 
      !(to->type() == MYSQL_TYPE_BLOB && to->table->copy_blobs))
 
749
      !(to->type() == DRIZZLE_TYPE_BLOB && to->table->copy_blobs))
751
750
  {
752
751
    /* Please god, will someone rewrite this to be readable :( */
753
752
    if (to->pack_length() == from->pack_length() && 
754
753
        !(to->flags & UNSIGNED_FLAG && !(from->flags & UNSIGNED_FLAG)) && 
755
 
        to->real_type() != MYSQL_TYPE_ENUM && 
756
 
        to->real_type() != MYSQL_TYPE_SET &&
757
 
        (to->real_type() != MYSQL_TYPE_NEWDECIMAL || (to->field_length == from->field_length && (((Field_num*)to)->dec == ((Field_num*)from)->dec))) &&
 
754
        to->real_type() != DRIZZLE_TYPE_ENUM && 
 
755
        to->real_type() != DRIZZLE_TYPE_SET &&
 
756
        (to->real_type() != DRIZZLE_TYPE_NEWDECIMAL || (to->field_length == from->field_length && (((Field_num*)to)->dec == ((Field_num*)from)->dec))) &&
758
757
        from->charset() == to->charset() &&
759
758
        to->table->s->db_low_byte_first == from->table->s->db_low_byte_first &&
760
 
        (!(to->table->in_use->variables.sql_mode & (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) || (to->type() != MYSQL_TYPE_NEWDATE && to->type() != MYSQL_TYPE_DATETIME)) && 
761
 
        (from->real_type() != MYSQL_TYPE_VARCHAR || ((Field_varstring*)from)->length_bytes == ((Field_varstring*)to)->length_bytes))
 
759
        (!(to->table->in_use->variables.sql_mode & (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) || (to->type() != DRIZZLE_TYPE_NEWDATE && to->type() != DRIZZLE_TYPE_DATETIME)) && 
 
760
        (from->real_type() != DRIZZLE_TYPE_VARCHAR || ((Field_varstring*)from)->length_bytes == ((Field_varstring*)to)->length_bytes))
762
761
    {                                           // Identical fields
763
762
#ifdef HAVE_purify
764
763
      /* This may happen if one does 'UPDATE ... SET x=x' */
768
767
      return 0;
769
768
    }
770
769
  }
771
 
  if (to->type() == MYSQL_TYPE_BLOB)
 
770
  if (to->type() == DRIZZLE_TYPE_BLOB)
772
771
  {                                             // Be sure the value is stored
773
772
    Field_blob *blob=(Field_blob*) to;
774
773
    from->val_str(&blob->value);
778
777
    */
779
778
    if (to->table->copy_blobs ||
780
779
        (!blob->value.is_alloced() &&
781
 
         from->real_type() != MYSQL_TYPE_STRING &&
782
 
         from->real_type() != MYSQL_TYPE_VARCHAR))
 
780
         from->real_type() != DRIZZLE_TYPE_STRING &&
 
781
         from->real_type() != DRIZZLE_TYPE_VARCHAR))
783
782
      blob->value.copy();
784
783
    return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
785
784
  }
786
 
  if (from->real_type() == MYSQL_TYPE_ENUM &&
787
 
      to->real_type() == MYSQL_TYPE_ENUM &&
 
785
  if (from->real_type() == DRIZZLE_TYPE_ENUM &&
 
786
      to->real_type() == DRIZZLE_TYPE_ENUM &&
788
787
      from->val_int() == 0)
789
788
  {
790
789
    ((Field_enum *)(to))->store_type(0);
792
791
  }
793
792
  else if ((from->result_type() == STRING_RESULT &&
794
793
            (to->result_type() == STRING_RESULT ||
795
 
             (from->real_type() != MYSQL_TYPE_ENUM &&
796
 
              from->real_type() != MYSQL_TYPE_SET))))
 
794
             (from->real_type() != DRIZZLE_TYPE_ENUM &&
 
795
              from->real_type() != DRIZZLE_TYPE_SET))))
797
796
  {
798
797
    char buff[MAX_FIELD_WIDTH];
799
798
    String result(buff,sizeof(buff),from->charset());