~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_insert.cc

Merge of Monty

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
#include <drizzled/field/timestamp.h>
34
34
#include <drizzled/lock.h>
35
35
 
36
 
#include <bitset>
37
 
 
38
 
using namespace std;
39
 
 
40
36
 
41
37
/*
42
38
  Check if insert fields are correct.
79
75
      No fields are provided so all fields must be provided in the values.
80
76
      Thus we set all bits in the write set.
81
77
    */
82
 
    table->write_set->set();
 
78
    table->setWriteSet();
83
79
  }
84
80
  else
85
81
  {                                             // Part field list
120
116
    }
121
117
    if (table->timestamp_field) // Don't automaticly set timestamp if used
122
118
    {
123
 
      if (table->write_set->test(table->timestamp_field->field_index))
 
119
      if (table->timestamp_field->isWriteSet())
124
120
        clear_timestamp_auto_bits(table->timestamp_field_type,
125
121
                                  TIMESTAMP_AUTO_SET_ON_INSERT);
126
122
      else
127
123
      {
128
 
        table->write_set->set(table->timestamp_field->field_index);
 
124
        table->setWriteSet(table->timestamp_field->field_index);
129
125
      }
130
126
    }
131
127
  }
166
162
      Unmark the timestamp field so that we can check if this is modified
167
163
      by update_fields
168
164
    */
169
 
    timestamp_mark= table->write_set->test(table->timestamp_field->field_index);
170
 
    table->write_set->reset(table->timestamp_field->field_index);
 
165
    timestamp_mark= bitmap_test_and_clear(table->write_set,
 
166
                                          table->timestamp_field->field_index);
171
167
  }
172
168
 
173
169
  /* Check the fields we are going to modify */
177
173
  if (table->timestamp_field)
178
174
  {
179
175
    /* Don't set timestamp column if this is modified. */
180
 
    if (table->write_set->test(table->timestamp_field->field_index))
 
176
    if (table->timestamp_field->isWriteSet())
181
177
      clear_timestamp_auto_bits(table->timestamp_field_type,
182
178
                                TIMESTAMP_AUTO_SET_ON_UPDATE);
183
179
    if (timestamp_mark)
184
 
      table->write_set->set(table->timestamp_field->field_index);
 
180
      table->setWriteSet(table->timestamp_field->field_index);
185
181
  }
186
182
  return 0;
187
183
}
718
714
{
719
715
  int error;
720
716
  char *key=0;
721
 
  bitset<MAX_FIELDS> *save_read_set, *save_write_set;
 
717
  MY_BITMAP *save_read_set, *save_write_set;
722
718
  uint64_t prev_insert_id= table->file->next_insert_id;
723
719
  uint64_t insert_id_for_cur_row= 0;
724
720
 
825
821
            table->next_number_field->val_int());
826
822
        info->touched++;
827
823
        if ((table->file->ha_table_flags() & HA_PARTIAL_COLUMN_READ &&
828
 
             !((*table->read_set & *table->write_set) == *table->write_set)) ||
 
824
             !bitmap_is_subset(table->write_set, table->read_set)) ||
829
825
            table->compare_record())
830
826
        {
831
827
          if ((error=table->file->ha_update_row(table->record[1],
962
958
                                           TableList *)
963
959
{
964
960
  int err= 0;
965
 
  bitset<MAX_FIELDS> *write_set= entry->write_set;
966
961
 
967
962
  for (Field **field=entry->field ; *field ; field++)
968
963
  {
969
 
    if (!write_set->test((*field)->field_index))
 
964
    if (((*field)->isWriteSet()) == false)
970
965
    {
971
966
      /*
972
967
       * If the field doesn't have any default value
1663
1658
 
1664
1659
  /* Mark all fields that are given values */
1665
1660
  for (Field **f= field ; *f ; f++)
1666
 
    table->write_set->set((*f)->field_index);
 
1661
    table->setWriteSet((*f)->field_index);
1667
1662
 
1668
1663
  /* Don't set timestamp if used */
1669
1664
  table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;