~sergefp/mysql-server/mysql-6.0-opt

« back to all changes in this revision

Viewing changes to sql/sql_join_cache.cc

  • Committer: Igor Babaev
  • Date: 2009-06-02 21:58:56 UTC
  • Revision ID: igor@mysql.com-20090602215856-utdq548h030qjn3r
Fixed bug #45092.
When the descriptors of the data fields stored in a join buffer 
are created first the descriptors of the the fields used in
building access keys are constructed. The construction is done
with a call of the function add_table_data_fields_to_join_cache.
One of the parameters of this function, namely field_set, specifies
for what fields the descriptors are to be constructed. This function
is called once again for the remaining fields.
As the function adds new elements to the array of the field
descriptors it has to save the number of the descriptors that
has been already built in order to be able continue adding them
later. The same is true for the array of pointers to the field
descriptors that is created for blob fields.
However the length of this array was not been saved. As a result,
when the remaining blob fields were processed the pointers to
their field descriptors overwrote the pointers to the descriptors
of the blob fields used to build the access keys.

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
    add_table_data_fields_to_join_cache()
80
80
      tab              descriptors of fields from this table are to be filled
81
81
      field_set        descriptors for only these fields are to be created
82
 
      field_cnt IN/OUT counter of data fields  
83
 
      descr  IN/OUT    pointer to the first descriptor to be filled
84
 
      descr_ptr IN/OUT pointer to the first pointer to blob descriptors 
 
82
      field_cnt IN/OUT     counter of data fields  
 
83
      descr  IN/OUT        pointer to the first descriptor to be filled
 
84
      field_ptr_cnt IN/OUT counter of pointers to the data fields
 
85
      descr_ptr IN/OUT     pointer to the first pointer to blob descriptors 
85
86
 
86
87
  DESCRIPTION
87
88
    The function fills in the descriptors of cache data fields from the table
103
104
                                         MY_BITMAP *field_set,
104
105
                                         uint *field_cnt, 
105
106
                                         CACHE_FIELD **descr,
 
107
                                         uint *field_ptr_cnt,
106
108
                                         CACHE_FIELD ***descr_ptr)
107
109
{
108
110
  Field **fld_ptr;
118
120
      if (copy->type == CACHE_BLOB)
119
121
      {
120
122
        *copy_ptr= copy;
121
 
          copy_ptr++;
 
123
        copy_ptr++;
 
124
        (*field_ptr_cnt)++;
122
125
      }
123
126
      copy->field= *fld_ptr;
124
127
      copy->referenced_field_no= 0;
160
163
  blobs= 0;
161
164
  flag_fields= 0;
162
165
  data_field_count= 0;
 
166
  data_field_ptr_count= 0;
163
167
  referenced_fields= 0;
164
168
 
165
169
  for ( ; tab < join_tab ; tab++)
316
320
    to this field is added as an element of the array blob_ptr. For a blob
317
321
    field only the size of the length of the blob data is taken into account.
318
322
    It is assumed that 'data_field_count' contains the number of descriptors
319
 
    for data fields that have been already created.
 
323
    for data fields that have been already created and 'data_field_ptr_count'
 
324
    contains the number of the pointers to such descriptors having been
 
325
    stored up to the moment.
320
326
 
321
327
  RETURN
322
328
    none 
326
332
{
327
333
  JOIN_TAB *tab;
328
334
  CACHE_FIELD *copy= field_descr+flag_fields+data_field_count;
329
 
  CACHE_FIELD **copy_ptr= blob_ptr;
 
335
  CACHE_FIELD **copy_ptr= blob_ptr+data_field_ptr_count;
330
336
 
331
337
  for (tab= join_tab-tables; tab < join_tab; tab++)
332
338
  {
343
349
    }  
344
350
 
345
351
    length+= add_table_data_fields_to_join_cache(tab, rem_field_set,
346
 
                                                 &data_field_count,
347
 
                                                 &copy, &copy_ptr);
 
352
                                                 &data_field_count, &copy,
 
353
                                                 &data_field_ptr_count,
 
354
                                                 &copy_ptr);
348
355
  
349
356
    /* SemiJoinDuplicateElimination: allocate space for rowid if needed */
350
357
    if (tab->keep_current_rowid)
627
634
  for (tab= join_tab-tables; tab < join_tab ; tab++)
628
635
  {
629
636
    length+= add_table_data_fields_to_join_cache(tab, &tab->table->tmp_set,
630
 
                                                 &data_field_count,  
631
 
                                                 &copy, &copy_ptr);
 
637
                                                 &data_field_count, &copy,
 
638
                                                 &data_field_ptr_count, 
 
639
                                                 &copy_ptr);
632
640
  }
633
641
 
634
642
  use_emb_key= check_emb_key_usage();