sql_select.cc
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:185k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.        &param->start_recinfo,
  2.        sizeof(*param->recinfo)*(field_count*2+4),
  3.        &tmpname,(uint) strlen(path)+1,
  4.        &group_buff,group && ! using_unique_constraint ?
  5.        param->group_length : 0,
  6.        NullS))
  7.   {
  8.     bitmap_clear_bit(&temp_pool, temp_pool_slot);
  9.     DBUG_RETURN(NULL); /* purecov: inspected */
  10.   }
  11.   if (!(param->copy_field=copy=new Copy_field[field_count]))
  12.   {
  13.     bitmap_clear_bit(&temp_pool, temp_pool_slot);
  14.     my_free((gptr) table,MYF(0)); /* purecov: inspected */
  15.     DBUG_RETURN(NULL); /* purecov: inspected */
  16.   }
  17.   param->funcs=copy_func;
  18.   strmov(tmpname,path);
  19.   /* make table according to fields */
  20.   bzero((char*) table,sizeof(*table));
  21.   bzero((char*) reg_field,sizeof(Field*)*(field_count+1));
  22.   bzero((char*) from_field,sizeof(Field*)*field_count);
  23.   table->field=reg_field;
  24.   table->real_name=table->path=tmpname;
  25.   table->table_name=base_name(tmpname);
  26.   table->reginfo.lock_type=TL_WRITE; /* Will be updated */
  27.   table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
  28.   table->blob_ptr_size=mi_portable_sizeof_char_ptr;
  29.   table->map=1;
  30.   table->tmp_table=1;
  31.   table->db_low_byte_first=1; // True for HEAP and MyISAM
  32.   table->temp_pool_slot = temp_pool_slot;
  33.   /* Calculate which type of fields we will store in the temporary table */
  34.   reclength=blob_count=null_count=hidden_null_count=group_null_items=0;
  35.   param->using_indirect_summary_function=0;
  36.   List_iterator<Item> li(fields);
  37.   Item *item;
  38.   Field **tmp_from_field=from_field;
  39.   while ((item=li++))
  40.   {
  41.     Item::Type type=item->type();
  42.     if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
  43.     {
  44.       /*
  45. Mark that the we have ignored an item that refers to a summary
  46. function. We need to know this if someone is going to use
  47. DISTINCT on the result.
  48.       */
  49.       param->using_indirect_summary_function=1;
  50.       continue;
  51.     }
  52.     if (item->const_item()) // We don't have to store this
  53.       continue;
  54.     if (type == Item::SUM_FUNC_ITEM && !group && !save_sum_fields)
  55.     { /* Can't calc group yet */
  56.       ((Item_sum*) item)->result_field=0;
  57.       for (i=0 ; i < ((Item_sum*) item)->arg_count ; i++)
  58.       {
  59. Item *arg= ((Item_sum*) item)->args[i];
  60. if (!arg->const_item())
  61. {
  62.   Field *new_field=
  63.     create_tmp_field(table,arg,arg->type(),&copy_func,tmp_from_field,
  64.      group != 0,1);
  65.   if (!new_field)
  66.     goto err; // Should be OOM
  67.   tmp_from_field++;
  68.   *(reg_field++)= new_field;
  69.   reclength+=new_field->pack_length();
  70.   if (!(new_field->flags & NOT_NULL_FLAG))
  71.     null_count++;
  72.   if (new_field->flags & BLOB_FLAG)
  73.     blob_count++;
  74.   ((Item_sum*) item)->args[i]= new Item_field(new_field);
  75. }
  76.       }
  77.     }
  78.     else
  79.     {
  80.       Field *new_field=create_tmp_field(table,item,type,&copy_func,
  81. tmp_from_field, group != 0,1);
  82.       if (!new_field)
  83.       {
  84. if (thd->fatal_error)
  85.   goto err; // Got OOM
  86. continue; // Some kindf of const item
  87.       }
  88.       if (type == Item::SUM_FUNC_ITEM)
  89. ((Item_sum *) item)->result_field= new_field;
  90.       tmp_from_field++;
  91.       reclength+=new_field->pack_length();
  92.       if (!(new_field->flags & NOT_NULL_FLAG))
  93. null_count++;
  94.       if (new_field->flags & BLOB_FLAG)
  95. blob_count++;
  96.       if (item->marker == 4 && item->maybe_null)
  97.       {
  98. group_null_items++;
  99. new_field->flags|= GROUP_FLAG;
  100.       }
  101.       *(reg_field++) =new_field;
  102.     }
  103.     if (!--hidden_field_count)
  104.       hidden_null_count=null_count;
  105.   }
  106.   field_count= (uint) (reg_field - table->field);
  107.   /* If result table is small; use a heap */
  108.   if (blob_count || using_unique_constraint ||
  109.       (select_options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
  110.       OPTION_BIG_TABLES)
  111.   {
  112.     table->file=get_new_handler(table,table->db_type=DB_TYPE_MYISAM);
  113.     if (group &&
  114. (param->group_parts > table->file->max_key_parts() ||
  115.  param->group_length > table->file->max_key_length()))
  116.       using_unique_constraint=1;
  117.   }
  118.   else
  119.   {
  120.     table->file=get_new_handler(table,table->db_type=DB_TYPE_HEAP);
  121.   }
  122.   if (!using_unique_constraint)
  123.     reclength+= group_null_items; // null flag is stored separately
  124.   table->blob_fields=blob_count;
  125.   if (blob_count == 0)
  126.   {
  127.     /* We need to ensure that first byte is not 0 for the delete link */
  128.     if (hidden_null_count)
  129.       hidden_null_count++;
  130.     else
  131.       null_count++;
  132.   }
  133.   hidden_null_pack_length=(hidden_null_count+7)/8;
  134.   null_pack_length=hidden_null_count+(null_count+7)/8;
  135.   reclength+=null_pack_length;
  136.   if (!reclength)
  137.     reclength=1; // Dummy select
  138.   table->fields=field_count;
  139.   table->reclength=reclength;
  140.   {
  141.     uint alloc_length=ALIGN_SIZE(reclength+MI_UNIQUE_HASH_LENGTH+1);
  142.     table->rec_buff_length=alloc_length;
  143.     if (!(table->record[0]= (byte *) my_malloc(alloc_length*3, MYF(MY_WME))))
  144.       goto err;
  145.     table->record[1]= table->record[0]+alloc_length;
  146.     table->record[2]= table->record[1]+alloc_length;
  147.   }
  148.   copy_func[0]=0; // End marker
  149.   recinfo=param->start_recinfo;
  150.   null_flags=(uchar*) table->record[0];
  151.   pos=table->record[0]+ null_pack_length;
  152.   if (null_pack_length)
  153.   {
  154.     bzero((byte*) recinfo,sizeof(*recinfo));
  155.     recinfo->type=FIELD_NORMAL;
  156.     recinfo->length=null_pack_length;
  157.     recinfo++;
  158.     bfill(null_flags,null_pack_length,255); // Set null fields
  159.   }
  160.   null_count= (blob_count == 0) ? 1 : 0;
  161.   hidden_field_count=param->hidden_field_count;
  162.   for (i=0,reg_field=table->field; i < field_count; i++,reg_field++,recinfo++)
  163.   {
  164.     Field *field= *reg_field;
  165.     uint length;
  166.     bzero((byte*) recinfo,sizeof(*recinfo));
  167.     if (!(field->flags & NOT_NULL_FLAG))
  168.     {
  169.       if (field->flags & GROUP_FLAG && !using_unique_constraint)
  170.       {
  171. *pos++=0; // Null is stored here
  172. recinfo->length=1;
  173. recinfo->type=FIELD_NORMAL;
  174. recinfo++;
  175. bzero((byte*) recinfo,sizeof(*recinfo));
  176.       }
  177.       else
  178.       {
  179. recinfo->null_bit= 1 << (null_count & 7);
  180. recinfo->null_pos= null_count/8;
  181.       }
  182.       field->move_field((char*) pos,null_flags+null_count/8,
  183. 1 << (null_count & 7));
  184.       null_count++;
  185.     }
  186.     else
  187.       field->move_field((char*) pos,(uchar*) 0,0);
  188.     field->reset();
  189.     if (from_field[i])
  190.     { /* Not a table Item */
  191.       copy->set(field,from_field[i],save_sum_fields);
  192.       copy++;
  193.     }
  194.     length=field->pack_length();
  195.     pos+= length;
  196.     /* Make entry for create table */
  197.     recinfo->length=length;
  198.     if (field->flags & BLOB_FLAG)
  199.       recinfo->type= (int) FIELD_BLOB;
  200.     else if (!field->zero_pack() &&
  201.      (field->type() == FIELD_TYPE_STRING ||
  202.       field->type() == FIELD_TYPE_VAR_STRING) &&
  203.      length >= 10 && blob_count)
  204.       recinfo->type=FIELD_SKIPP_ENDSPACE;
  205.     else
  206.       recinfo->type=FIELD_NORMAL;
  207.     if (!--hidden_field_count)
  208.       null_count=(null_count+7) & ~7; // move to next byte
  209.   }
  210.   param->copy_field_count=(uint) (copy - param->copy_field);
  211.   param->recinfo=recinfo;
  212.   store_record(table,2); // Make empty default record
  213.   table->max_rows=(((table->db_type == DB_TYPE_HEAP) ?
  214.     min(tmp_table_size, max_heap_table_size) : tmp_table_size)/
  215.    table->reclength);
  216.   set_if_bigger(table->max_rows,1); // For dummy start options
  217.   keyinfo=param->keyinfo;
  218.   if (group)
  219.   {
  220.     DBUG_PRINT("info",("Creating group key in temporary table"));
  221.     table->group=group; /* Table is grouped by key */
  222.     param->group_buff=group_buff;
  223.     table->keys=1;
  224.     table->uniques= test(using_unique_constraint);
  225.     table->key_info=keyinfo;
  226.     keyinfo->key_part=key_part_info;
  227.     keyinfo->flags=HA_NOSAME;
  228.     keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts;
  229.     keyinfo->key_length=0;
  230.     keyinfo->rec_per_key=0;
  231.     for (; group ; group=group->next,key_part_info++)
  232.     {
  233.       Field *field=(*group->item)->tmp_table_field();
  234.       bool maybe_null=(*group->item)->maybe_null;
  235.       key_part_info->null_bit=0;
  236.       key_part_info->field=  field;
  237.       key_part_info->offset= field->offset();
  238.       key_part_info->length= (uint16) field->pack_length();
  239.       key_part_info->type=   (uint8) field->key_type();
  240.       key_part_info->key_type =
  241. ((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
  242.  (ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT) ?
  243. 0 : FIELDFLAG_BINARY;
  244.       if (!using_unique_constraint)
  245.       {
  246. group->buff=(char*) group_buff;
  247. if (!(group->field=field->new_field(table)))
  248.   goto err; /* purecov: inspected */
  249. if (maybe_null)
  250. {
  251.   /*
  252.     To be able to group on NULL, we move the null bit to be
  253.      just before the column and extend the key to cover the null bit
  254.   */
  255.   *group_buff= 0; // Init null byte
  256.   key_part_info->offset--;
  257.   key_part_info->length++;
  258.   group->field->move_field((char*) group_buff+1, (uchar*) group_buff,
  259.    1);
  260. }
  261. else
  262.   group->field->move_field((char*) group_buff);
  263. group_buff+= key_part_info->length;
  264.       }
  265.       keyinfo->key_length+=  key_part_info->length;
  266.     }
  267.   }
  268.   if (distinct)
  269.   {
  270.     /*
  271.       Create an unique key or an unique constraint over all columns
  272.       that should be in the result.  In the temporary table, there are
  273.       'param->hidden_field_count' extra columns, whose null bits are stored
  274.       in the first 'hidden_null_pack_length' bytes of the row.
  275.     */
  276.     null_pack_length-=hidden_null_pack_length;
  277.     keyinfo->key_parts=field_count+ test(null_pack_length);
  278.     if (allow_distinct_limit)
  279.     {
  280.       set_if_smaller(table->max_rows,thd->select_limit);
  281.       param->end_write_records=thd->select_limit;
  282.     }
  283.     else
  284.       param->end_write_records= HA_POS_ERROR;
  285.     table->distinct=1;
  286.     table->keys=1;
  287.     if (blob_count)
  288.     {
  289.       using_unique_constraint=1;
  290.       table->uniques=1;
  291.     }
  292.     if (!(key_part_info= (KEY_PART_INFO*)
  293.   sql_calloc((keyinfo->key_parts)*sizeof(KEY_PART_INFO))))
  294.       goto err;
  295.     table->key_info=keyinfo;
  296.     keyinfo->key_part=key_part_info;
  297.     keyinfo->flags=HA_NOSAME;
  298.     keyinfo->key_length=(uint16) reclength;
  299.     keyinfo->name=(char*) "tmp";
  300.     if (null_pack_length)
  301.     {
  302.       key_part_info->null_bit=0;
  303.       key_part_info->offset=hidden_null_pack_length;
  304.       key_part_info->length=null_pack_length;
  305.       key_part_info->field=new Field_string((char*) table->record[0],
  306.     (uint32) key_part_info->length,
  307.     (uchar*) 0,
  308.     (uint) 0,
  309.     Field::NONE,
  310.     NullS, table, (bool) 1);
  311.       key_part_info->key_type=FIELDFLAG_BINARY;
  312.       key_part_info->type=    HA_KEYTYPE_BINARY;
  313.       key_part_info++;
  314.     }
  315.     for (i=param->hidden_field_count, reg_field=table->field + i ;
  316.  i < field_count;
  317.  i++, reg_field++, key_part_info++)
  318.     {
  319.       key_part_info->null_bit=0;
  320.       key_part_info->field=    *reg_field;
  321.       key_part_info->offset=   (*reg_field)->offset();
  322.       key_part_info->length=   (uint16) (*reg_field)->pack_length();
  323.       key_part_info->type=     (uint8) (*reg_field)->key_type();
  324.       key_part_info->key_type =
  325. ((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
  326.  (ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT) ?
  327. 0 : FIELDFLAG_BINARY;
  328.     }
  329.   }
  330.   if (thd->fatal_error) // If end of memory
  331.     goto err;  /* purecov: inspected */
  332.   table->db_record_offset=1;
  333.   if (table->db_type == DB_TYPE_MYISAM)
  334.   {
  335.     if (create_myisam_tmp_table(table,param,select_options))
  336.       goto err;
  337.   }
  338.   if (!open_tmp_table(table))
  339.     DBUG_RETURN(table);
  340.  err:
  341.   free_tmp_table(thd,table);                    /* purecov: inspected */
  342.   bitmap_clear_bit(&temp_pool, temp_pool_slot);
  343.   DBUG_RETURN(NULL); /* purecov: inspected */
  344. }
  345. static bool open_tmp_table(TABLE *table)
  346. {
  347.   int error;
  348.   if ((error=table->file->ha_open(table->real_name,O_RDWR,HA_OPEN_TMP_TABLE)))
  349.   {
  350.     table->file->print_error(error,MYF(0)); /* purecov: inspected */
  351.     table->db_stat=0;
  352.     return(1);
  353.   }
  354.   /* VOID(ha_lock(table,F_WRLCK)); */ /* Single thread table */
  355.   (void) table->file->extra(HA_EXTRA_NO_READCHECK); /* Not needed */
  356.   (void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
  357.   return(0);
  358. }
  359. static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
  360.     uint options)
  361. {
  362.   int error;
  363.   MI_KEYDEF keydef;
  364.   MI_UNIQUEDEF uniquedef;
  365.   KEY *keyinfo=param->keyinfo;
  366.   DBUG_ENTER("create_myisam_tmp_table");
  367.   if (table->keys)
  368.   { // Get keys for ni_create
  369.     bool using_unique_constraint=0;
  370.     MI_KEYSEG *seg= (MI_KEYSEG*) sql_calloc(sizeof(*seg) *
  371.     keyinfo->key_parts);
  372.     if (!seg)
  373.       goto err;
  374.     if (keyinfo->key_length >= table->file->max_key_length() ||
  375. keyinfo->key_parts > table->file->max_key_parts() ||
  376. table->uniques)
  377.     {
  378.       /* Can't create a key; Make a unique constraint instead of a key */
  379.       table->keys=0;
  380.       table->uniques=1;
  381.       using_unique_constraint=1;
  382.       bzero((char*) &uniquedef,sizeof(uniquedef));
  383.       uniquedef.keysegs=keyinfo->key_parts;
  384.       uniquedef.seg=seg;
  385.       uniquedef.null_are_equal=1;
  386.       /* Create extra column for hash value */
  387.       bzero((byte*) param->recinfo,sizeof(*param->recinfo));
  388.       param->recinfo->type= FIELD_CHECK;
  389.       param->recinfo->length=MI_UNIQUE_HASH_LENGTH;
  390.       param->recinfo++;
  391.       table->reclength+=MI_UNIQUE_HASH_LENGTH;
  392.     }
  393.     else
  394.     {
  395.       /* Create an unique key */
  396.       bzero((char*) &keydef,sizeof(keydef));
  397.       keydef.flag=HA_NOSAME | HA_BINARY_PACK_KEY | HA_PACK_KEY;
  398.       keydef.keysegs=  keyinfo->key_parts;
  399.       keydef.seg= seg;
  400.     }
  401.     for (uint i=0; i < keyinfo->key_parts ; i++,seg++)
  402.     {
  403.       Field *field=keyinfo->key_part[i].field;
  404.       seg->flag=0;
  405.       seg->language=MY_CHARSET_CURRENT;
  406.       seg->length=keyinfo->key_part[i].length;
  407.       seg->start=keyinfo->key_part[i].offset;
  408.       if (field->flags & BLOB_FLAG)
  409.       {
  410. seg->type=
  411. ((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
  412.  HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT);
  413. seg->bit_start=seg->length - table->blob_ptr_size;
  414. seg->flag= HA_BLOB_PART;
  415. seg->length=0; // Whole blob in unique constraint
  416.       }
  417.       else
  418.       {
  419. seg->type=
  420.   ((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
  421.    HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT);
  422. if (!(field->flags & ZEROFILL_FLAG) &&
  423.     (field->type() == FIELD_TYPE_STRING ||
  424.      field->type() == FIELD_TYPE_VAR_STRING) &&
  425.     keyinfo->key_part[i].length > 4)
  426.   seg->flag|=HA_SPACE_PACK;
  427.       }
  428.       if (using_unique_constraint &&
  429.   !(field->flags & NOT_NULL_FLAG))
  430.       {
  431. seg->null_bit= field->null_bit;
  432. seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]);
  433.       }
  434.     }
  435.   }
  436.   MI_CREATE_INFO create_info;
  437.   bzero((char*) &create_info,sizeof(create_info));
  438.   if ((options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
  439.       OPTION_BIG_TABLES)
  440.     create_info.data_file_length= ~(ulonglong) 0;
  441.   if ((error=mi_create(table->real_name,table->keys,&keydef,
  442.        (uint) (param->recinfo-param->start_recinfo),
  443.        param->start_recinfo,
  444.        table->uniques, &uniquedef,
  445.        &create_info,
  446.        HA_CREATE_TMP_TABLE)))
  447.   {
  448.     table->file->print_error(error,MYF(0)); /* purecov: inspected */
  449.     table->db_stat=0;
  450.     goto err;
  451.   }
  452.   statistic_increment(created_tmp_disk_tables, &LOCK_status);
  453.   table->db_record_offset=1;
  454.   DBUG_RETURN(0);
  455.  err:
  456.   DBUG_RETURN(1);
  457. }
  458. void
  459. free_tmp_table(THD *thd, TABLE *entry)
  460. {
  461.   const char *save_proc_info;
  462.   DBUG_ENTER("free_tmp_table");
  463.   DBUG_PRINT("enter",("table: %s",entry->table_name));
  464.   save_proc_info=thd->proc_info;
  465.   thd->proc_info="removing tmp table";
  466.   if (entry->db_stat && entry->file)
  467.   {
  468.     (void) entry->file->close();
  469.     delete entry->file;
  470.   }
  471.   if (!(test_flags & TEST_KEEP_TMP_TABLES) || entry->db_type == DB_TYPE_HEAP)
  472.     (void) ha_delete_table(entry->db_type,entry->real_name);
  473.   /* free blobs */
  474.   for (Field **ptr=entry->field ; *ptr ; ptr++)
  475.     delete *ptr;
  476.   my_free((gptr) entry->record[0],MYF(0));
  477.   free_io_cache(entry);
  478.   bitmap_clear_bit(&temp_pool, entry->temp_pool_slot);
  479.   my_free((gptr) entry,MYF(0));
  480.   thd->proc_info=save_proc_info;
  481.   DBUG_VOID_RETURN;
  482. }
  483. /*
  484. * If a HEAP table gets full, create a MyISAM table and copy all rows to this
  485. */
  486. bool create_myisam_from_heap(TABLE *table, TMP_TABLE_PARAM *param, int error,
  487.      bool ignore_last_dupp_key_error)
  488. {
  489.   TABLE new_table;
  490.   const char *save_proc_info;
  491.   THD *thd=current_thd;
  492.   int write_err;
  493.   DBUG_ENTER("create_myisam_from_heap");
  494.   if (table->db_type != DB_TYPE_HEAP || error != HA_ERR_RECORD_FILE_FULL)
  495.   {
  496.     table->file->print_error(error,MYF(0));
  497.     DBUG_RETURN(1);
  498.   }
  499.   new_table= *table;
  500.   new_table.db_type=DB_TYPE_MYISAM;
  501.   if (!(new_table.file=get_new_handler(&new_table,DB_TYPE_MYISAM)))
  502.     DBUG_RETURN(1); // End of memory
  503.   save_proc_info=thd->proc_info;
  504.   thd->proc_info="converting HEAP to MyISAM";
  505.   if (create_myisam_tmp_table(&new_table,param,
  506.       thd->lex.options | thd->options))
  507.     goto err2;
  508.   if (open_tmp_table(&new_table))
  509.     goto err1;
  510.   table->file->index_end();
  511.   table->file->rnd_init();
  512.   /* copy all old rows */
  513.   while (!table->file->rnd_next(new_table.record[1]))
  514.   {
  515.     if ((write_err=new_table.file->write_row(new_table.record[1])))
  516.       goto err;
  517.   }
  518.   /* copy row that filled HEAP table */
  519.   if ((write_err=new_table.file->write_row(table->record[0])))
  520.   {
  521.     if (write_err != HA_ERR_FOUND_DUPP_KEY &&
  522. write_err != HA_ERR_FOUND_DUPP_UNIQUE || !ignore_last_dupp_key_error)
  523.     goto err;
  524.   }
  525.   /* remove heap table and change to use myisam table */
  526.   (void) table->file->rnd_end();
  527.   (void) table->file->close();
  528.   (void) table->file->delete_table(table->real_name);
  529.   delete table->file;
  530.   table->file=0;
  531.   *table =new_table;
  532.   table->file->change_table_ptr(table);
  533.   thd->proc_info=save_proc_info;
  534.   DBUG_RETURN(0);
  535.  err:
  536.   DBUG_PRINT("error",("Got error: %d",write_err));
  537.   table->file->print_error(error,MYF(0)); // Give table is full error
  538.   (void) table->file->rnd_end();
  539.   (void) new_table.file->close();
  540.  err1:
  541.   new_table.file->delete_table(new_table.real_name);
  542.   delete new_table.file;
  543.  err2:
  544.   thd->proc_info=save_proc_info;
  545.   DBUG_RETURN(1);
  546. }
  547. /*****************************************************************************
  548. ** Make a join of all tables and write it on socket or to table
  549. *****************************************************************************/
  550. static int
  551. do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
  552. {
  553.   int error;
  554.   JOIN_TAB *join_tab;
  555.   int (*end_select)(JOIN *, struct st_join_table *,bool);
  556.   DBUG_ENTER("do_select");
  557.   join->procedure=procedure;
  558.   /*
  559.   ** Tell the client how many fields there are in a row
  560.   */
  561.   if (!table)
  562.     join->result->send_fields(*fields,1);
  563.   else
  564.   {
  565.     VOID(table->file->extra(HA_EXTRA_WRITE_CACHE));
  566.     empty_record(table);
  567.   }
  568.   join->tmp_table=table; /* Save for easy recursion */
  569.   join->fields= fields;
  570.   /* Set up select_end */
  571.   if (table)
  572.   {
  573.     if (table->group && join->tmp_table_param.sum_func_count)
  574.     {
  575.       DBUG_PRINT("info",("Using end_update"));
  576.       if (table->keys)
  577.       {
  578. end_select=end_update;
  579. table->file->index_init(0);
  580.       }
  581.       else
  582. end_select=end_unique_update;
  583.     }
  584.     else if (join->sort_and_group)
  585.     {
  586.       DBUG_PRINT("info",("Using end_write_group"));
  587.       end_select=end_write_group;
  588.     }
  589.     else
  590.     {
  591.       DBUG_PRINT("info",("Using end_write"));
  592.       end_select=end_write;
  593.     }
  594.   }
  595.   else
  596.   {
  597.     if (join->sort_and_group || (join->procedure &&
  598.  join->procedure->flags & PROC_GROUP))
  599.       end_select=end_send_group;
  600.     else
  601.       end_select=end_send;
  602.   }
  603.   join->join_tab[join->tables-1].next_select=end_select;
  604.   join_tab=join->join_tab+join->const_tables;
  605.   join->send_records=0;
  606.   if (join->tables == join->const_tables)
  607.   {
  608.     if (!(error=(*end_select)(join,join_tab,0)) || error == -3)
  609.       error=(*end_select)(join,join_tab,1);
  610.   }
  611.   else
  612.   {
  613.     error=sub_select(join,join_tab,0);
  614.     if (error >= 0)
  615.       error=sub_select(join,join_tab,1);
  616.     if (error == -3)
  617.       error=0; /* select_limit used */
  618.   }
  619.   if (!table) /* If sending data to client */
  620.   {
  621.     if (error < 0)
  622.       join->result->send_error(0,NullS); /* purecov: inspected */
  623.     else
  624.     {
  625.       join_free(join); // Unlock all cursors
  626.       if (join->result->send_eof())
  627. error= -1;
  628.     }
  629.   }
  630.   else if (error < 0)
  631.     join->result->send_error(0,NullS); /* purecov: inspected */
  632.   if (error >= 0)
  633.   {
  634.     DBUG_PRINT("info",("%ld records output",join->send_records));
  635.   }
  636.   if (table)
  637.   {
  638.     int old_error=error,tmp;
  639.     if ((tmp=table->file->extra(HA_EXTRA_NO_CACHE)))
  640.     {
  641.       my_errno=tmp;
  642.       error= -1;
  643.     }
  644.     if (table->file->index_end())
  645.     {
  646.       my_errno=tmp;
  647.       error= -1;
  648.     }
  649.     if (error != old_error)
  650.       table->file->print_error(my_errno,MYF(0));
  651.   }
  652.   DBUG_RETURN(error < 0);
  653. }
  654. static int
  655. sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
  656. {
  657.   int error;
  658.   if (end_of_records)
  659.   {
  660.     if ((error=flush_cached_records(join,join_tab,FALSE)) < 0)
  661.       return error; /* purecov: inspected */
  662.     return sub_select(join,join_tab,end_of_records);
  663.   }
  664.   if (join->thd->killed) // If aborted by user
  665.   {
  666.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  667.     return -2;  /* purecov: inspected */
  668.   }
  669.   if (join_tab->use_quick != 2 || test_if_quick_select(join_tab) <= 0)
  670.   {
  671.     if (!store_record_in_cache(&join_tab->cache))
  672.       return 0; // There is more room in cache
  673.     return flush_cached_records(join,join_tab,FALSE);
  674.   }
  675.   if ((error=flush_cached_records(join,join_tab,TRUE)) < 0)
  676.     return error; /* purecov: inspected */
  677.   return sub_select(join,join_tab,end_of_records); /* Use ordinary select */
  678. }
  679. static int
  680. sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
  681. {
  682.   join_tab->table->null_row=0;
  683.   if (end_of_records)
  684.     return (*join_tab->next_select)(join,join_tab+1,end_of_records);
  685.   /* Cache variables for faster loop */
  686.   int error;
  687.   bool found=0;
  688.   COND *on_expr=join_tab->on_expr, *select_cond=join_tab->select_cond;
  689.   int  (*next_select)(JOIN *,struct st_join_table *,bool)=
  690.     join_tab->next_select;
  691.   if (!(error=(*join_tab->read_first_record)(join_tab)))
  692.   {
  693.     bool not_exists_optimize= join_tab->table->reginfo.not_exists_optimize;
  694.     bool not_used_in_distinct=join_tab->not_used_in_distinct;
  695.     ha_rows found_records=join->found_records;
  696.     READ_RECORD *info= &join_tab->read_record;
  697.     do
  698.     {
  699.       if (join->thd->killed) // Aborted by user
  700.       {
  701. my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  702. return -2; /* purecov: inspected */
  703.       }
  704.       if (!on_expr || on_expr->val_int())
  705.       {
  706. found=1;
  707. if (not_exists_optimize)
  708.   break; // Searching after not null columns
  709. if (!select_cond || select_cond->val_int())
  710. {
  711.   if ((error=(*next_select)(join,join_tab+1,0)) < 0)
  712.     return error;
  713.   if (not_used_in_distinct && found_records != join->found_records)
  714.     return 0;
  715. }
  716.       }
  717.     } while (!(error=info->read_record(info)));
  718.     if (error > 0) // Fatal error
  719.       return -1;
  720.   }
  721.   else if (error > 0)
  722.     return -1;
  723.   if (!found && on_expr)
  724.   { // OUTER JOIN
  725.     restore_record(join_tab->table,2); // Make empty record
  726.     mark_as_null_row(join_tab->table); // For group by without error
  727.     if (!select_cond || select_cond->val_int())
  728.     {
  729.       if ((error=(*next_select)(join,join_tab+1,0)) < 0)
  730. return error; /* purecov: inspected */
  731.     }
  732.   }
  733.   return 0;
  734. }
  735. static int
  736. flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skipp_last)
  737. {
  738.   int error;
  739.   READ_RECORD *info;
  740.   if (!join_tab->cache.records)
  741.     return 0; /* Nothing to do */
  742.   if (skipp_last)
  743.     (void) store_record_in_cache(&join_tab->cache); // Must save this for later
  744.   if (join_tab->use_quick == 2)
  745.   {
  746.     if (join_tab->select->quick)
  747.     { /* Used quick select last. reset it */
  748.       delete join_tab->select->quick;
  749.       join_tab->select->quick=0;
  750.     }
  751.   }
  752.  /* read through all records */
  753.   if ((error=join_init_read_record(join_tab)))
  754.   {
  755.     reset_cache(&join_tab->cache);
  756.     join_tab->cache.records=0; join_tab->cache.ptr_record= (uint) ~0;
  757.     return -error; /* No records or error */
  758.   }
  759.   for (JOIN_TAB *tmp=join->join_tab; tmp != join_tab ; tmp++)
  760.   {
  761.     tmp->status=tmp->table->status;
  762.     tmp->table->status=0;
  763.   }
  764.   info= &join_tab->read_record;
  765.   do
  766.   {
  767.     if (join->thd->killed)
  768.     {
  769.       my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  770.       return -2; // Aborted by user /* purecov: inspected */
  771.     }
  772.     SQL_SELECT *select=join_tab->select;
  773.     if (!error && (!join_tab->cache.select ||
  774.    !join_tab->cache.select->skipp_record()))
  775.     {
  776.       uint i;
  777.       reset_cache(&join_tab->cache);
  778.       for (i=(join_tab->cache.records- (skipp_last ? 1 : 0)) ; i-- > 0 ;)
  779.       {
  780. read_cached_record(join_tab);
  781. if (!select || !select->skipp_record())
  782.   if ((error=(join_tab->next_select)(join,join_tab+1,0)) < 0)
  783.     return error; /* purecov: inspected */
  784.       }
  785.     }
  786.   } while (!(error=info->read_record(info)));
  787.   if (skipp_last)
  788.     read_cached_record(join_tab); // Restore current record
  789.   reset_cache(&join_tab->cache);
  790.   join_tab->cache.records=0; join_tab->cache.ptr_record= (uint) ~0;
  791.   if (error > 0) // Fatal error
  792.     return -1; /* purecov: inspected */
  793.   for (JOIN_TAB *tmp2=join->join_tab; tmp2 != join_tab ; tmp2++)
  794.     tmp2->table->status=tmp2->status;
  795.   return 0;
  796. }
  797. /*****************************************************************************
  798. ** The different ways to read a record
  799. ** Returns -1 if row was not found, 0 if row was found and 1 on errors
  800. *****************************************************************************/
  801. static int
  802. join_read_const_tables(JOIN *join)
  803. {
  804.   uint i;
  805.   int error;
  806.   DBUG_ENTER("join_read_const_tables");
  807.   for (i=0 ; i < join->const_tables ; i++)
  808.   {
  809.     TABLE *form=join->table[i];
  810.     form->null_row=0;
  811.     form->status=STATUS_NO_RECORD;
  812.     if (join->join_tab[i].type == JT_SYSTEM)
  813.     {
  814.       if ((error=join_read_system(join->join_tab+i)))
  815.       { // Info for DESCRIBE
  816. join->join_tab[i].info="const row not found";
  817. join->best_positions[i].records_read=0.0;
  818. if (!form->outer_join || error > 0)
  819.   DBUG_RETURN(error);
  820.       }
  821.     }
  822.     else
  823.     {
  824.       if ((error=join_read_const(join->join_tab+i)))
  825.       {
  826. join->join_tab[i].info="unique row not found";
  827. join->best_positions[i].records_read=0.0;
  828. if (!form->outer_join || error > 0)
  829.   DBUG_RETURN(error);
  830.       }
  831.     }
  832.     if (join->join_tab[i].on_expr && !form->null_row)
  833.     {
  834.       if ((form->null_row= test(join->join_tab[i].on_expr->val_int() == 0)))
  835. empty_record(form);
  836.     }
  837.     if (!form->null_row)
  838.       form->maybe_null=0;
  839.   }
  840.   DBUG_RETURN(0);
  841. }
  842. static int
  843. join_read_system(JOIN_TAB *tab)
  844. {
  845.   TABLE *table= tab->table;
  846.   int error;
  847.   if (table->status & STATUS_GARBAGE) // If first read
  848.   {
  849.     if ((error=table->file->rnd_first(table->record[0])))
  850.     {
  851.       if (error != HA_ERR_END_OF_FILE)
  852.       {
  853. table->file->print_error(error,MYF(0));
  854. return 1;
  855.       }
  856.       table->null_row=1; // This is ok.
  857.       empty_record(table); // Make empty record
  858.       return -1;
  859.     }
  860.     store_record(table,1);
  861.   }
  862.   else if (!table->status) // Only happens with left join
  863.     restore_record(table,1); // restore old record
  864.   table->null_row=0;
  865.   return table->status ? -1 : 0;
  866. }
  867. static int
  868. join_read_const(JOIN_TAB *tab)
  869. {
  870.   int error;
  871.   TABLE *table= tab->table;
  872.   if (table->status & STATUS_GARBAGE) // If first read
  873.   {
  874.     if (cp_buffer_from_ref(&tab->ref))
  875.       error=HA_ERR_KEY_NOT_FOUND;
  876.     else
  877.     {
  878.       error=table->file->index_read_idx(table->record[0],tab->ref.key,
  879. (byte*) tab->ref.key_buff,
  880. tab->ref.key_length,HA_READ_KEY_EXACT);
  881.     }
  882.     if (error)
  883.     {
  884.       table->null_row=1;
  885.       empty_record(table);
  886.       if (error != HA_ERR_KEY_NOT_FOUND)
  887.       {
  888. sql_print_error("read_const: Got error %d when reading table %s",
  889. error, table->path);
  890. table->file->print_error(error,MYF(0));
  891. return 1;
  892.       }
  893.       return -1;
  894.     }
  895.     store_record(table,1);
  896.   }
  897.   else if (!table->status) // Only happens with left join
  898.     restore_record(table,1); // restore old record
  899.   table->null_row=0;
  900.   return table->status ? -1 : 0;
  901. }
  902. static int
  903. join_read_key(JOIN_TAB *tab)
  904. {
  905.   int error;
  906.   TABLE *table= tab->table;
  907.   if (cmp_buffer_with_ref(tab) ||
  908.       (table->status & (STATUS_GARBAGE | STATUS_NO_PARENT | STATUS_NULL_ROW)))
  909.   {
  910.     if (tab->ref.key_err)
  911.     {
  912.       table->status=STATUS_NOT_FOUND;
  913.       return -1;
  914.     }
  915.     error=table->file->index_read(table->record[0],
  916.   tab->ref.key_buff,
  917.   tab->ref.key_length,HA_READ_KEY_EXACT);
  918.     if (error && error != HA_ERR_KEY_NOT_FOUND)
  919.     {
  920.       sql_print_error("read_key: Got error %d when reading table '%s'",error,
  921.       table->path);
  922.       table->file->print_error(error,MYF(0));
  923.       return 1;
  924.     }
  925.   }
  926.   table->null_row=0;
  927.   return table->status ? -1 : 0;
  928. }
  929. static int
  930. join_read_always_key(JOIN_TAB *tab)
  931. {
  932.   int error;
  933.   TABLE *table= tab->table;
  934.   if (cp_buffer_from_ref(&tab->ref))
  935.     return -1;
  936.   if ((error=table->file->index_read(table->record[0],
  937.      tab->ref.key_buff,
  938.      tab->ref.key_length,HA_READ_KEY_EXACT)))
  939.   {
  940.     if (error != HA_ERR_KEY_NOT_FOUND)
  941.     {
  942.       sql_print_error("read_const: Got error %d when reading table %s",error,
  943.       table->path);
  944.       table->file->print_error(error,MYF(0));
  945.       return 1;
  946.     }
  947.     return -1; /* purecov: inspected */
  948.   }
  949.   return 0;
  950. }
  951. /* ARGSUSED */
  952. static int
  953. join_no_more_records(READ_RECORD *info __attribute__((unused)))
  954. {
  955.   return -1;
  956. }
  957. static int
  958. join_read_next(READ_RECORD *info)
  959. {
  960.   int error;
  961.   TABLE *table= info->table;
  962.   JOIN_TAB *tab=table->reginfo.join_tab;
  963.   if ((error=table->file->index_next_same(table->record[0],
  964.   tab->ref.key_buff,
  965.   tab->ref.key_length)))
  966.   {
  967.     if (error != HA_ERR_END_OF_FILE)
  968.     {
  969.       sql_print_error("read_next: Got error %d when reading table %s",error,
  970.       table->path);
  971.       table->file->print_error(error,MYF(0));
  972.       return 1;
  973.     }
  974.     table->status= STATUS_GARBAGE;
  975.     return -1;
  976.   }
  977.   return 0;
  978. }
  979. static int
  980. join_init_quick_read_record(JOIN_TAB *tab)
  981. {
  982.   if (test_if_quick_select(tab) == -1)
  983.     return -1; /* No possible records */
  984.   return join_init_read_record(tab);
  985. }
  986. static int
  987. test_if_quick_select(JOIN_TAB *tab)
  988. {
  989.   delete tab->select->quick;
  990.   tab->select->quick=0;
  991.   return tab->select->test_quick_select(tab->keys,(table_map) 0,HA_POS_ERROR);
  992. }
  993. static int
  994. join_init_read_record(JOIN_TAB *tab)
  995. {
  996.   if (tab->select && tab->select->quick)
  997.     tab->select->quick->reset();
  998.   init_read_record(&tab->read_record,current_thd, tab->table, tab->select,1,1);
  999.   return (*tab->read_record.read_record)(&tab->read_record);
  1000. }
  1001. static int
  1002. join_init_read_first_with_key(JOIN_TAB *tab)
  1003. {
  1004.   int error;
  1005.   TABLE *table=tab->table;
  1006.   if (!table->key_read && (table->used_keys & ((key_map) 1 << tab->index)))
  1007.   {
  1008.     table->key_read=1;
  1009.     table->file->extra(HA_EXTRA_KEYREAD);
  1010.   }
  1011.   tab->table->status=0;
  1012.   tab->read_record.read_record=join_init_read_next_with_key;
  1013.   tab->read_record.table=table;
  1014.   tab->read_record.file=table->file;
  1015.   tab->read_record.index=tab->index;
  1016.   tab->read_record.record=table->record[0];
  1017.   error=tab->table->file->index_first(tab->table->record[0]);
  1018.   if (error)
  1019.   {
  1020.     if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
  1021.     {
  1022.       sql_print_error("read_first_with_key: Got error %d when reading table",
  1023.       error);
  1024.       table->file->print_error(error,MYF(0));
  1025.       return 1;
  1026.     }
  1027.     return -1;
  1028.   }
  1029.   return 0;
  1030. }
  1031. static int
  1032. join_init_read_next_with_key(READ_RECORD *info)
  1033. {
  1034.   int error=info->file->index_next(info->record);
  1035.   if (error)
  1036.   {
  1037.     if (error != HA_ERR_END_OF_FILE)
  1038.     {
  1039.       sql_print_error("read_next_with_key: Got error %d when reading table %s",
  1040.       error, info->table->path);
  1041.       info->file->print_error(error,MYF(0));
  1042.       return 1;
  1043.     }
  1044.     return -1;
  1045.   }
  1046.   return 0;
  1047. }
  1048. static int
  1049. join_init_read_last_with_key(JOIN_TAB *tab)
  1050. {
  1051.   TABLE *table=tab->table;
  1052.   int error;
  1053.   if (!table->key_read && (table->used_keys & ((key_map) 1 << tab->index)))
  1054.   {
  1055.     table->key_read=1;
  1056.     table->file->extra(HA_EXTRA_KEYREAD);
  1057.   }
  1058.   tab->table->status=0;
  1059.   tab->read_record.read_record=join_init_read_prev_with_key;
  1060.   tab->read_record.table=table;
  1061.   tab->read_record.file=table->file;
  1062.   tab->read_record.index=tab->index;
  1063.   tab->read_record.record=table->record[0];
  1064.   error=tab->table->file->index_last(tab->table->record[0]);
  1065.   if (error)
  1066.   {
  1067.     if (error != HA_ERR_END_OF_FILE)
  1068.     {
  1069.       sql_print_error("read_last_with_key: Got error %d when reading table",
  1070.       error, table->path);
  1071.       table->file->print_error(error,MYF(0));
  1072.       return 1;
  1073.     }
  1074.     return -1;
  1075.   }
  1076.   return 0;
  1077. }
  1078. static int
  1079. join_init_read_prev_with_key(READ_RECORD *info)
  1080. {
  1081.   int error=info->file->index_prev(info->record);
  1082.   if (error)
  1083.   {
  1084.     if (error != HA_ERR_END_OF_FILE)
  1085.     {
  1086.       sql_print_error("read_prev_with_key: Got error %d when reading table: %s",
  1087.       error,info->table->path);
  1088.       info->file->print_error(error,MYF(0));
  1089.       return 1;
  1090.     }
  1091.     return -1;
  1092.   }
  1093.   return 0;
  1094. }
  1095. static int
  1096. join_ft_read_first(JOIN_TAB *tab)
  1097. {
  1098.   int error;
  1099.   TABLE *table= tab->table;
  1100. #if 0
  1101.   if (cp_buffer_from_ref(&tab->ref))       // as ft-key doesn't use store_key's
  1102.     return -1;                             // see also FT_SELECT::init()
  1103. #endif
  1104.   table->file->ft_init();
  1105.   error=table->file->ft_read(table->record[0]);
  1106.   if (error)
  1107.   {
  1108.     if (error != HA_ERR_END_OF_FILE)
  1109.     {
  1110.       sql_print_error("ft_read_first: Got error %d when reading table %s",
  1111.                       error, table->path);
  1112.       table->file->print_error(error,MYF(0));
  1113.       return 1;
  1114.     }
  1115.     return -1;
  1116.   }
  1117.   return 0;
  1118. }
  1119. static int
  1120. join_ft_read_next(READ_RECORD *info)
  1121. {
  1122.   int error=info->file->ft_read(info->table->record[0]);
  1123.   if (error)
  1124.   {
  1125.     if (error != HA_ERR_END_OF_FILE)
  1126.     {
  1127.       sql_print_error("ft_read_next: Got error %d when reading table %s",
  1128.                       error, info->table->path);
  1129.       info->file->print_error(error,MYF(0));
  1130.       return 1;
  1131.     }
  1132.     return -1;
  1133.   }
  1134.   return 0;
  1135. }
  1136. /*****************************************************************************
  1137. ** The different end of select functions
  1138. ** These functions returns < 0 when end is reached, 0 on ok and > 0 if a
  1139. ** fatal error (like table corruption) was detected
  1140. *****************************************************************************/
  1141. /* ARGSUSED */
  1142. static int
  1143. end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1144.  bool end_of_records)
  1145. {
  1146.   DBUG_ENTER("end_send");
  1147.   if (!end_of_records)
  1148.   {
  1149.     int error;
  1150.     if (join->having && join->having->val_int() == 0)
  1151.       DBUG_RETURN(0); // Didn't match having
  1152.     if (join->procedure)
  1153.       error=join->procedure->send_row(*join->fields);
  1154.     else
  1155.       error=join->result->send_data(*join->fields);
  1156.     if (error)
  1157.       DBUG_RETURN(-1); /* purecov: inspected */
  1158.     if (++join->send_records >= join->thd->select_limit)
  1159.       DBUG_RETURN(-3); // Abort nicely
  1160.   }
  1161.   else
  1162.   {
  1163.     if (join->procedure && join->procedure->end_of_records())
  1164.       DBUG_RETURN(-1);
  1165.   }
  1166.   DBUG_RETURN(0);
  1167. }
  1168. /* ARGSUSED */
  1169. static int
  1170. end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1171.        bool end_of_records)
  1172. {
  1173.   int idx= -1;
  1174.   DBUG_ENTER("end_send_group");
  1175.   if (!join->first_record || end_of_records ||
  1176.       (idx=test_if_group_changed(join->group_fields)) >= 0)
  1177.   {
  1178.     if (join->first_record || (end_of_records && !join->group))
  1179.     {
  1180.       if (join->procedure)
  1181. join->procedure->end_group();
  1182.       if (idx < (int) join->send_group_parts)
  1183.       {
  1184. int error;
  1185. if (join->procedure)
  1186. {
  1187.   if (join->having && join->having->val_int() == 0)
  1188.     error= -1; // Didn't satisfy having
  1189.   else
  1190.     error=join->procedure->send_row(*join->fields) ? 1 : 0;
  1191.   if (end_of_records && join->procedure->end_of_records())
  1192.     error= 1; // Fatal error
  1193. }
  1194. else
  1195. {
  1196.   if (!join->first_record)
  1197.     clear_tables(join);
  1198.   if (join->having && join->having->val_int() == 0)
  1199.     error= -1; // Didn't satisfy having
  1200.   else
  1201.     error=join->result->send_data(*join->fields) ? 1 : 0;
  1202. }
  1203. if (error > 0)
  1204.   DBUG_RETURN(-1); /* purecov: inspected */
  1205. if (end_of_records)
  1206.   DBUG_RETURN(0);
  1207. if (!error && ++join->send_records >= join->thd->select_limit)
  1208.   DBUG_RETURN(-3); /* Abort nicely */
  1209.       }
  1210.     }
  1211.     else
  1212.     {
  1213.       if (end_of_records)
  1214. DBUG_RETURN(0);
  1215.       join->first_record=1;
  1216.       VOID(test_if_group_changed(join->group_fields));
  1217.     }
  1218.     if (idx < (int) join->send_group_parts)
  1219.     {
  1220.       copy_fields(&join->tmp_table_param);
  1221.       init_sum_functions(join->sum_funcs);
  1222.       if (join->procedure)
  1223. join->procedure->add();
  1224.       DBUG_RETURN(0);
  1225.     }
  1226.   }
  1227.   if (update_sum_func(join->sum_funcs))
  1228.     DBUG_RETURN(-1);
  1229.   if (join->procedure)
  1230.     join->procedure->add();
  1231.   DBUG_RETURN(0);
  1232. }
  1233. /* ARGSUSED */
  1234. static int
  1235. end_write(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1236.   bool end_of_records)
  1237. {
  1238.   TABLE *table=join->tmp_table;
  1239.   int error;
  1240.   DBUG_ENTER("end_write");
  1241.   if (join->thd->killed) // Aborted by user
  1242.   {
  1243.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  1244.     DBUG_RETURN(-2); /* purecov: inspected */
  1245.   }
  1246.   if (!end_of_records)
  1247.   {
  1248.     copy_fields(&join->tmp_table_param);
  1249.     copy_funcs(join->tmp_table_param.funcs);
  1250.     if (!table->uniques) // If not unique handling
  1251.     {
  1252.       /* Copy null values from group to row */
  1253.       ORDER   *group;
  1254.       for (group=table->group ; group ; group=group->next)
  1255.       {
  1256. Item *item= *group->item;
  1257. if (item->maybe_null)
  1258. {
  1259.   Field *field=item->tmp_table_field();
  1260.   field->ptr[-1]= (byte) (field->is_null() ? 0 : 1);
  1261. }
  1262.       }
  1263.     }
  1264.     if (!join->having || join->having->val_int())
  1265.     {
  1266.       join->found_records++;
  1267.       if ((error=table->file->write_row(table->record[0])))
  1268.       {
  1269. if (error == HA_ERR_FOUND_DUPP_KEY ||
  1270.     error == HA_ERR_FOUND_DUPP_UNIQUE)
  1271.   goto end;
  1272. if (create_myisam_from_heap(table, &join->tmp_table_param, error,1))
  1273.   DBUG_RETURN(1); // Not a table_is_full error
  1274. table->uniques=0; // To ensure rows are the same
  1275. if (++join->send_records >= join->tmp_table_param.end_write_records)
  1276.   DBUG_RETURN(-3);
  1277.       }
  1278.     }
  1279.   }
  1280. end:
  1281.   DBUG_RETURN(0);
  1282. }
  1283. /* Group by searching after group record and updating it if possible */
  1284. /* ARGSUSED */
  1285. static int
  1286. end_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1287.    bool end_of_records)
  1288. {
  1289.   TABLE *table=join->tmp_table;
  1290.   ORDER   *group;
  1291.   int   error;
  1292.   DBUG_ENTER("end_update");
  1293.   if (end_of_records)
  1294.     DBUG_RETURN(0);
  1295.   if (join->thd->killed) // Aborted by user
  1296.   {
  1297.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  1298.     DBUG_RETURN(-2); /* purecov: inspected */
  1299.   }
  1300.   join->found_records++;
  1301.   copy_fields(&join->tmp_table_param); // Groups are copied twice.
  1302.   /* Make a key of group index */
  1303.   for (group=table->group ; group ; group=group->next)
  1304.   {
  1305.     Item *item= *group->item;
  1306.     item->save_org_in_field(group->field);
  1307.     if (item->maybe_null)
  1308.       group->buff[0]=item->null_value ? 0: 1; // Save reversed value
  1309.   }
  1310.   // table->file->index_init(0);
  1311.   if (!table->file->index_read(table->record[1],
  1312.        join->tmp_table_param.group_buff,0,
  1313.        HA_READ_KEY_EXACT))
  1314.   { /* Update old record */
  1315.     restore_record(table,1);
  1316.     update_tmptable_sum_func(join->sum_funcs,table);
  1317.     if ((error=table->file->update_row(table->record[1],
  1318.        table->record[0])))
  1319.     {
  1320.       table->file->print_error(error,MYF(0)); /* purecov: inspected */
  1321.       DBUG_RETURN(-1); /* purecov: inspected */
  1322.     }
  1323.     DBUG_RETURN(0);
  1324.   }
  1325.   /* The null bits are already set */
  1326.   KEY_PART_INFO *key_part;
  1327.   for (group=table->group,key_part=table->key_info[0].key_part;
  1328.        group ;
  1329.        group=group->next,key_part++)
  1330.     memcpy(table->record[0]+key_part->offset, group->buff, key_part->length);
  1331.   init_tmptable_sum_functions(join->sum_funcs);
  1332.   copy_funcs(join->tmp_table_param.funcs);
  1333.   if ((error=table->file->write_row(table->record[0])))
  1334.   {
  1335.     if (create_myisam_from_heap(table, &join->tmp_table_param, error, 0))
  1336.       DBUG_RETURN(-1); // Not a table_is_full error
  1337.     /* Change method to update rows */
  1338.     table->file->index_init(0);
  1339.     join->join_tab[join->tables-1].next_select=end_unique_update;
  1340.   }
  1341.   join->send_records++;
  1342.   DBUG_RETURN(0);
  1343. }
  1344. /* Like end_update, but this is done with unique constraints instead of keys */
  1345. static int
  1346. end_unique_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1347.   bool end_of_records)
  1348. {
  1349.   TABLE *table=join->tmp_table;
  1350.   int   error;
  1351.   DBUG_ENTER("end_unique_update");
  1352.   if (end_of_records)
  1353.     DBUG_RETURN(0);
  1354.   if (join->thd->killed) // Aborted by user
  1355.   {
  1356.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  1357.     DBUG_RETURN(-2); /* purecov: inspected */
  1358.   }
  1359.   init_tmptable_sum_functions(join->sum_funcs);
  1360.   copy_fields(&join->tmp_table_param); // Groups are copied twice.
  1361.   copy_funcs(join->tmp_table_param.funcs);
  1362.   if (!(error=table->file->write_row(table->record[0])))
  1363.     join->send_records++; // New group
  1364.   else
  1365.   {
  1366.     if ((int) table->file->get_dup_key(error) < 0)
  1367.     {
  1368.       table->file->print_error(error,MYF(0)); /* purecov: inspected */
  1369.       DBUG_RETURN(-1); /* purecov: inspected */
  1370.     }
  1371.     if (table->file->rnd_pos(table->record[1],table->file->dupp_ref))
  1372.     {
  1373.       table->file->print_error(error,MYF(0)); /* purecov: inspected */
  1374.       DBUG_RETURN(-1); /* purecov: inspected */
  1375.     }
  1376.     restore_record(table,1);
  1377.     update_tmptable_sum_func(join->sum_funcs,table);
  1378.     if ((error=table->file->update_row(table->record[1],
  1379.        table->record[0])))
  1380.     {
  1381.       table->file->print_error(error,MYF(0)); /* purecov: inspected */
  1382.       DBUG_RETURN(-1); /* purecov: inspected */
  1383.     }
  1384.   }
  1385.   DBUG_RETURN(0);
  1386. }
  1387. /* ARGSUSED */
  1388. static int
  1389. end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
  1390. bool end_of_records)
  1391. {
  1392.   TABLE *table=join->tmp_table;
  1393.   int   error;
  1394.   int   idx= -1;
  1395.   DBUG_ENTER("end_write_group");
  1396.   if (join->thd->killed)
  1397.   { // Aborted by user
  1398.     my_error(ER_SERVER_SHUTDOWN,MYF(0)); /* purecov: inspected */
  1399.     DBUG_RETURN(-2); /* purecov: inspected */
  1400.   }
  1401.   if (!join->first_record || end_of_records ||
  1402.       (idx=test_if_group_changed(join->group_fields)) >= 0)
  1403.   {
  1404.     if (join->first_record || (end_of_records && !join->group))
  1405.     {
  1406.       if (join->procedure)
  1407. join->procedure->end_group();
  1408.       if (idx < (int) join->send_group_parts)
  1409.       {
  1410. if (!join->first_record)
  1411.   clear_tables(join);
  1412. copy_sum_funcs(join->sum_funcs);
  1413. if (!join->having || join->having->val_int())
  1414. {
  1415.   if ((error=table->file->write_row(table->record[0])))
  1416.   {
  1417.     if (create_myisam_from_heap(table, &join->tmp_table_param,
  1418. error, 0))
  1419.       DBUG_RETURN(1); // Not a table_is_full error
  1420.   }
  1421.   else
  1422.     join->send_records++;
  1423. }
  1424. if (end_of_records)
  1425.   DBUG_RETURN(0);
  1426.       }
  1427.     }
  1428.     else
  1429.     {
  1430.       join->first_record=1;
  1431.       VOID(test_if_group_changed(join->group_fields));
  1432.     }
  1433.     if (idx < (int) join->send_group_parts)
  1434.     {
  1435.       copy_fields(&join->tmp_table_param);
  1436.       copy_funcs(join->tmp_table_param.funcs);
  1437.       init_sum_functions(join->sum_funcs);
  1438.       if (join->procedure)
  1439. join->procedure->add();
  1440.       DBUG_RETURN(0);
  1441.     }
  1442.   }
  1443.   if (update_sum_func(join->sum_funcs))
  1444.     DBUG_RETURN(-1);
  1445.   if (join->procedure)
  1446.     join->procedure->add();
  1447.   DBUG_RETURN(0);
  1448. }
  1449. /*****************************************************************************
  1450. ** Remove calculation with tables that aren't yet read. Remove also tests
  1451. ** against fields that are read through key where the table is not a 
  1452. ** outer join table.
  1453. ** We can't remove tests that are made against columns which are stored
  1454. ** in sorted order.
  1455. *****************************************************************************/
  1456. /* Return 1 if right_item is used removable reference key on left_item */
  1457. static bool test_if_ref(Item_field *left_item,Item *right_item)
  1458. {
  1459.   Field *field=left_item->field;
  1460.   if (!field->table->const_table) // No need to change const test
  1461.   {
  1462.     Item *ref_item=part_of_refkey(field->table,field);
  1463.     if (ref_item && ref_item->eq(right_item))
  1464.     {
  1465.       if (right_item->type() == Item::FIELD_ITEM)
  1466. return (field->eq_def(((Item_field *) right_item)->field) &&
  1467. !field->table->maybe_null);
  1468.       if (right_item->const_item())
  1469.       {
  1470. // We can remove binary fields and numerical fields except float,
  1471. // as float comparison isn't 100 % secure
  1472. if (field->binary() &&
  1473.     (field->type() != FIELD_TYPE_FLOAT || field->decimals() == 0))
  1474. {
  1475.   return !store_val_in_field(field,right_item);
  1476. }
  1477.       }
  1478.     }
  1479.   }
  1480.   return 0; // keep test
  1481. }
  1482. static COND *
  1483. make_cond_for_table(COND *cond,table_map tables,table_map used_table)
  1484. {
  1485.   if (used_table && !(cond->used_tables() & used_table))
  1486.     return (COND*) 0; // Already checked
  1487.   if (cond->type() == Item::COND_ITEM)
  1488.   {
  1489.     if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
  1490.     {
  1491.       Item_cond_and *new_cond=new Item_cond_and;
  1492.       if (!new_cond)
  1493. return (COND*) 0; // OOM /* purecov: inspected */
  1494.       List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
  1495.       Item *item;
  1496.       while ((item=li++))
  1497.       {
  1498. Item *fix=make_cond_for_table(item,tables,used_table);
  1499. if (fix)
  1500.   new_cond->argument_list()->push_back(fix);
  1501.       }
  1502.       switch (new_cond->argument_list()->elements) {
  1503.       case 0:
  1504. return (COND*) 0; // Always true
  1505.       case 1:
  1506. return new_cond->argument_list()->head();
  1507.       default:
  1508. new_cond->used_tables_cache=((Item_cond*) cond)->used_tables_cache &
  1509.   tables;
  1510. return new_cond;
  1511.       }
  1512.     }
  1513.     else
  1514.     { // Or list
  1515.       Item_cond_or *new_cond=new Item_cond_or;
  1516.       if (!new_cond)
  1517. return (COND*) 0; // OOM /* purecov: inspected */
  1518.       List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
  1519.       Item *item;
  1520.       while ((item=li++))
  1521.       {
  1522. Item *fix=make_cond_for_table(item,tables,0L);
  1523. if (!fix)
  1524.   return (COND*) 0; // Always true
  1525. new_cond->argument_list()->push_back(fix);
  1526.       }
  1527.       new_cond->used_tables_cache=((Item_cond_or*) cond)->used_tables_cache;
  1528.       return new_cond;
  1529.     }
  1530.   }
  1531.   /*
  1532.   ** Because the following test takes a while and it can be done
  1533.   ** table_count times, we mark each item that we have examined with the result
  1534.   ** of the test
  1535.   */
  1536.   if (cond->marker == 3 || (cond->used_tables() & ~tables))
  1537.     return (COND*) 0; // Can't check this yet
  1538.   if (cond->marker == 2 || cond->eq_cmp_result() == Item::COND_OK)
  1539.     return cond; // Not boolean op
  1540.   if (((Item_func*) cond)->functype() == Item_func::EQ_FUNC)
  1541.   {
  1542.     Item *left_item= ((Item_func*) cond)->arguments()[0];
  1543.     Item *right_item= ((Item_func*) cond)->arguments()[1];
  1544.     if (left_item->type() == Item::FIELD_ITEM &&
  1545. test_if_ref((Item_field*) left_item,right_item))
  1546.     {
  1547.       cond->marker=3; // Checked when read
  1548.       return (COND*) 0;
  1549.     }
  1550.     if (right_item->type() == Item::FIELD_ITEM &&
  1551. test_if_ref((Item_field*) right_item,left_item))
  1552.     {
  1553.       cond->marker=3; // Checked when read
  1554.       return (COND*) 0;
  1555.     }
  1556.   }
  1557.   cond->marker=2;
  1558.   return cond;
  1559. }
  1560. static Item *
  1561. part_of_refkey(TABLE *table,Field *field)
  1562. {
  1563.   uint ref_parts=table->reginfo.join_tab->ref.key_parts;
  1564.   if (ref_parts)
  1565.   {
  1566.     KEY_PART_INFO *key_part=
  1567.       table->key_info[table->reginfo.join_tab->ref.key].key_part;
  1568.     for (uint part=0 ; part < ref_parts ; part++,key_part++)
  1569.       if (field->eq(key_part->field) &&
  1570.   !(key_part->key_part_flag & HA_PART_KEY))
  1571. return table->reginfo.join_tab->ref.items[part];
  1572.   }
  1573.   return (Item*) 0;
  1574. }
  1575. /*****************************************************************************
  1576. ** Test if one can use the key to resolve ORDER BY
  1577. ** Returns: 1 if key is ok.
  1578. **     0 if key can't be used
  1579. **     -1 if reverse key can be used
  1580. *****************************************************************************/
  1581. static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx)
  1582. {
  1583.   KEY_PART_INFO *key_part,*key_part_end;
  1584.   key_part=table->key_info[idx].key_part;
  1585.   key_part_end=key_part+table->key_info[idx].key_parts;
  1586.   key_part_map const_key_parts=table->const_key_parts[idx];
  1587.   int reverse=0;
  1588.   for (; order ; order=order->next, const_key_parts>>=1)
  1589.   {
  1590.     Field *field=((Item_field*) (*order->item))->field;
  1591.     int flag;
  1592.     /*
  1593.       Skip key parts that are constants in the WHERE clause.
  1594.       These are already skipped in the ORDER BY by const_expression_in_where()
  1595.     */
  1596.     while (const_key_parts & 1)
  1597.     {
  1598.       key_part++; const_key_parts>>=1;
  1599.     }
  1600.     if (key_part == key_part_end || key_part->field != field)
  1601.       return 0;
  1602.     /* set flag to 1 if we can use read-next on key, else to -1 */
  1603.     flag=(order->asc == !(key_part->key_part_flag & HA_REVERSE_SORT))
  1604.       ? 1 : -1;
  1605.     if (reverse && flag != reverse)
  1606.       return 0;
  1607.     reverse=flag; // Remember if reverse
  1608.     key_part++;
  1609.   }
  1610.   return reverse;
  1611. }
  1612. static uint find_shortest_key(TABLE *table, key_map usable_keys)
  1613. {
  1614.   uint min_length= (uint) ~0;
  1615.   uint best= MAX_KEY;
  1616.   for (uint nr=0; usable_keys ; usable_keys>>=1, nr++)
  1617.   {
  1618.     if (usable_keys & 1)
  1619.     {
  1620.       if (table->key_info[nr].key_length < min_length)
  1621.       {
  1622. min_length=table->key_info[nr].key_length;
  1623. best=nr;
  1624.       }
  1625.     }
  1626.   }
  1627.   return best;
  1628. }
  1629. /*****************************************************************************
  1630. ** If not selecting by given key, create a index how records should be read
  1631. ** return: 0  ok
  1632. **   -1 some fatal error
  1633. **    1  no records
  1634. *****************************************************************************/
  1635. /* Return 1 if we don't have to do file sorting */
  1636. static bool
  1637. test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit)
  1638. {
  1639.   int ref_key;
  1640.   TABLE *table=tab->table;
  1641.   SQL_SELECT *select=tab->select;
  1642.   key_map usable_keys;
  1643.   DBUG_ENTER("test_if_skip_sort_order");
  1644.   /* Check which keys can be used to resolve ORDER BY */
  1645.   usable_keys= ~(key_map) 0;
  1646.   for (ORDER *tmp_order=order; tmp_order ; tmp_order=tmp_order->next)
  1647.   {
  1648.     if ((*tmp_order->item)->type() != Item::FIELD_ITEM)
  1649.     {
  1650.       usable_keys=0;
  1651.       break;
  1652.     }
  1653.     usable_keys&=((Item_field*) (*tmp_order->item))->field->part_of_sortkey;
  1654.   }
  1655.   ref_key= -1;
  1656.   if (tab->ref.key >= 0) // Constant range in WHERE
  1657.     ref_key=tab->ref.key;
  1658.   else if (select && select->quick) // Range found by opt_range
  1659.     ref_key=select->quick->index;
  1660.   if (ref_key >= 0)
  1661.   {
  1662.     /* Check if we get the rows in requested sorted order by using the key */
  1663.     if ((usable_keys & ((key_map) 1 << ref_key)) &&
  1664. test_if_order_by_key(order,table,ref_key) == 1)
  1665.       DBUG_RETURN(1); /* No need to sort */
  1666.   }
  1667.   else
  1668.   {
  1669.     /* check if we can use a key to resolve the group */
  1670.     /* Tables using JT_NEXT are handled here */
  1671.     uint nr;
  1672.     key_map keys=usable_keys;
  1673.     /*
  1674.       If not used with LIMIT, only use keys if the whole query can be
  1675.       resolved with a key;  This is because filesort() is usually faster than
  1676.       retrieving all rows through an index.
  1677.     */
  1678.     if (select_limit >= table->file->records)
  1679.       keys&= table->used_keys;
  1680.     for (nr=0; keys ; keys>>=1, nr++)
  1681.     {
  1682.       if (keys & 1)
  1683.       {
  1684. int flag;
  1685. if ((flag=test_if_order_by_key(order,table,nr)))
  1686. {
  1687.   tab->index=nr;
  1688.   tab->read_first_record=  (flag > 0 ? join_init_read_first_with_key:
  1689.     join_init_read_last_with_key);
  1690.   table->file->index_init(nr);
  1691.   tab->type=JT_NEXT; // Read with index_first(), index_next()
  1692.   DBUG_RETURN(1);
  1693. }
  1694.       }
  1695.     }
  1696.   }
  1697.   DBUG_RETURN(0); // Can't use index.
  1698. }
  1699. static int
  1700. create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit)
  1701. {
  1702.   SORT_FIELD *sortorder;
  1703.   uint length;
  1704.   TABLE *table=tab->table;
  1705.   SQL_SELECT *select=tab->select;
  1706.   DBUG_ENTER("create_sort_index");
  1707.   if (test_if_skip_sort_order(tab,order,select_limit))
  1708.     DBUG_RETURN(0);
  1709.   if (!(sortorder=make_unireg_sortorder(order,&length)))
  1710.     goto err; /* purecov: inspected */
  1711.   /* It's not fatal if the following alloc fails */
  1712.   table->io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
  1713. MYF(MY_WME | MY_ZEROFILL));
  1714.   table->status=0; // May be wrong if quick_select
  1715.   // If table has a range, move it to select
  1716.   if (select && !select->quick && tab->ref.key >= 0)
  1717.   {
  1718.     if (tab->quick)
  1719.     {
  1720.       select->quick=tab->quick;
  1721.       tab->quick=0;
  1722.       /* We can only use 'Only index' if quick key is same as ref_key */
  1723.       if (table->key_read && (uint) tab->ref.key != select->quick->index)
  1724.       {
  1725. table->key_read=0;
  1726. table->file->extra(HA_EXTRA_NO_KEYREAD);
  1727.       }
  1728.     }
  1729.     else
  1730.     {
  1731.       /*
  1732. We have a ref on a const;  Change this to a range that filesort
  1733. can use.
  1734.       */
  1735.       if (!(select->quick=get_ft_or_quick_select_for_ref(table, tab)))
  1736. goto err;
  1737.     }
  1738.   }
  1739.   table->found_records=filesort(&table,sortorder,length,
  1740. select, 0L, select_limit);
  1741.   delete select; // filesort did select
  1742.   tab->select=0;
  1743.   tab->select_cond=0;
  1744.   tab->type=JT_ALL; // Read with normal read_record
  1745.   tab->read_first_record= join_init_read_record;
  1746.   if (table->key_read) // Restore if we used indexes
  1747.   {
  1748.     table->key_read=0;
  1749.     table->file->extra(HA_EXTRA_NO_KEYREAD);
  1750.   }
  1751.   DBUG_RETURN(table->found_records == HA_POS_ERROR);
  1752. err:
  1753.   DBUG_RETURN(-1);
  1754. }
  1755. /*****************************************************************************
  1756. ** Remove duplicates from tmp table
  1757. ** This should be recoded to add a uniuqe index to the table and remove
  1758. ** dupplicates
  1759. ** Table is a locked single thread table
  1760. ** fields is the number of fields to check (from the end)
  1761. *****************************************************************************/
  1762. static bool compare_record(TABLE *table, Field **ptr)
  1763. {
  1764.   for (; *ptr ; ptr++)
  1765.   {
  1766.     if ((*ptr)->cmp_offset(table->rec_buff_length))
  1767.       return 1;
  1768.   }
  1769.   return 0;
  1770. }
  1771. static bool copy_blobs(Field **ptr)
  1772. {
  1773.   for (; *ptr ; ptr++)
  1774.   {
  1775.     if ((*ptr)->flags & BLOB_FLAG)
  1776.       if (((Field_blob *) (*ptr))->copy())
  1777. return 1; // Error
  1778.   }
  1779.   return 0;
  1780. }
  1781. static void free_blobs(Field **ptr)
  1782. {
  1783.   for (; *ptr ; ptr++)
  1784.   {
  1785.     if ((*ptr)->flags & BLOB_FLAG)
  1786.       ((Field_blob *) (*ptr))->free();
  1787.   }
  1788. }
  1789. static int
  1790. remove_duplicates(JOIN *join, TABLE *entry,List<Item> &fields)
  1791. {
  1792.   int error;
  1793.   ulong reclength,offset;
  1794.   uint field_count;
  1795.   DBUG_ENTER("remove_duplicates");
  1796.   entry->reginfo.lock_type=TL_WRITE;
  1797.   entry->file->extra(HA_EXTRA_NO_READCHECK);
  1798.   /* Calculate how many saved fields there is in list */
  1799.   field_count=0;
  1800.   List_iterator<Item> it(fields);
  1801.   Item *item;
  1802.   while ((item=it++))
  1803.   {
  1804.     if (item->tmp_table_field() && ! item->const_item())
  1805.       field_count++;
  1806.   }
  1807.   if (!field_count)
  1808.   { // only const items
  1809.     join->thd->select_limit=1; // Only send first row
  1810.     DBUG_RETURN(0);
  1811.   }
  1812.   Field **first_field=entry->field+entry->fields - field_count;
  1813.   offset=entry->field[entry->fields - field_count]->offset();
  1814.   reclength=entry->reclength-offset;
  1815.   free_io_cache(entry); // Safety
  1816.   entry->file->info(HA_STATUS_VARIABLE);
  1817.   if (entry->db_type == DB_TYPE_HEAP ||
  1818.       (!entry->blob_fields &&
  1819.        ((ALIGN_SIZE(reclength) +sizeof(HASH_LINK)) * entry->file->records <
  1820. sortbuff_size)))
  1821.     error=remove_dup_with_hash_index(join->thd, entry,
  1822.      field_count, first_field,
  1823.      reclength);
  1824.   else
  1825.     error=remove_dup_with_compare(join->thd, entry, first_field, offset);
  1826.   free_blobs(first_field);
  1827.   DBUG_RETURN(error);
  1828. }
  1829. static int remove_dup_with_compare(THD *thd, TABLE *table, Field **first_field,
  1830.    ulong offset)
  1831. {
  1832.   handler *file=table->file;
  1833.   char *org_record,*new_record;
  1834.   int error;
  1835.   ulong reclength=table->reclength-offset;
  1836.   DBUG_ENTER("remove_dup_with_compare");
  1837.   org_record=(char*) table->record[0]+offset;
  1838.   new_record=(char*) table->record[1]+offset;
  1839.   file->rnd_init();
  1840.   error=file->rnd_next(table->record[0]);
  1841.   for (;;)
  1842.   {
  1843.     if (thd->killed)
  1844.     {
  1845.       my_error(ER_SERVER_SHUTDOWN,MYF(0));
  1846.       error=0;
  1847.       goto err;
  1848.     }
  1849.     if (error)
  1850.     {
  1851.       if (error == HA_ERR_RECORD_DELETED)
  1852. continue;
  1853.       if (error == HA_ERR_END_OF_FILE)
  1854. break;
  1855.       goto err;
  1856.     }
  1857.     if (copy_blobs(first_field))
  1858.     {
  1859.       my_error(ER_OUT_OF_SORTMEMORY,MYF(0));
  1860.       error=0;
  1861.       goto err;
  1862.     }
  1863.     memcpy(new_record,org_record,reclength);
  1864.     /* Read through rest of file and mark duplicated rows deleted */
  1865.     bool found=0;
  1866.     for (;;)
  1867.     {
  1868.       if ((error=file->rnd_next(table->record[0])))
  1869.       {
  1870. if (error == HA_ERR_RECORD_DELETED)
  1871.   continue;
  1872. if (error == HA_ERR_END_OF_FILE)
  1873.   break;
  1874. goto err;
  1875.       }
  1876.       if (compare_record(table, first_field) == 0)
  1877.       {
  1878. if ((error=file->delete_row(table->record[0])))
  1879.   goto err;
  1880.       }
  1881.       else if (!found)
  1882.       {
  1883. found=1;
  1884. file->position(table->record[0]); // Remember position
  1885.       }
  1886.     }
  1887.     if (!found)
  1888.       break; // End of file
  1889.     /* Restart search on next row */
  1890.     error=file->restart_rnd_next(table->record[0],file->ref);
  1891.   }
  1892.   file->extra(HA_EXTRA_NO_CACHE);
  1893.   DBUG_RETURN(0);
  1894. err:
  1895.   file->extra(HA_EXTRA_NO_CACHE);
  1896.   if (error)
  1897.     file->print_error(error,MYF(0));
  1898.   DBUG_RETURN(1);
  1899. }
  1900. /*
  1901.   Generate a hash index for each row to quickly find duplicate rows
  1902.   Note that this will not work on tables with blobs!
  1903. */
  1904. static int remove_dup_with_hash_index(THD *thd, TABLE *table,
  1905.       uint field_count,
  1906.       Field **first_field,
  1907.       ulong key_length)
  1908. {
  1909.   byte *key_buffer, *key_pos, *record=table->record[0];
  1910.   int error;
  1911.   handler *file=table->file;
  1912.   ulong extra_length=ALIGN_SIZE(key_length)-key_length;
  1913.   uint *field_lengths,*field_length;
  1914.   HASH hash;
  1915.   DBUG_ENTER("remove_dup_with_hash_index");
  1916.   if (!my_multi_malloc(MYF(MY_WME),
  1917.        &key_buffer,
  1918.        (uint) ((key_length + extra_length) *
  1919.        (long) file->records),
  1920.        &field_lengths,
  1921.        (uint) (field_count*sizeof(*field_lengths)),
  1922.        NullS))
  1923.     DBUG_RETURN(1);
  1924.   if (hash_init(&hash, (uint) file->records, 0, key_length,
  1925. (hash_get_key) 0, 0, 0))
  1926.   {
  1927.     my_free((char*) key_buffer,MYF(0));
  1928.     DBUG_RETURN(1);
  1929.   }
  1930.   {
  1931.     Field **ptr;
  1932.     for (ptr= first_field, field_length=field_lengths ; *ptr ; ptr++)
  1933.       (*field_length++)= (*ptr)->pack_length();
  1934.   }
  1935.   file->rnd_init();
  1936.   key_pos=key_buffer;
  1937.   for (;;)
  1938.   {
  1939.     if (thd->killed)
  1940.     {
  1941.       my_error(ER_SERVER_SHUTDOWN,MYF(0));
  1942.       error=0;
  1943.       goto err;
  1944.     }
  1945.     if ((error=file->rnd_next(record)))
  1946.     {
  1947.       if (error == HA_ERR_RECORD_DELETED)
  1948. continue;
  1949.       if (error == HA_ERR_END_OF_FILE)
  1950. break;
  1951.       goto err;
  1952.     }
  1953.     /* copy fields to key buffer */
  1954.     field_length=field_lengths;
  1955.     for (Field **ptr= first_field ; *ptr ; ptr++)
  1956.     {
  1957.       (*ptr)->sort_string((char*) key_pos,*field_length);
  1958.       key_pos+= *field_length++;
  1959.     }
  1960.     /* Check if it exists before */
  1961.     if (hash_search(&hash,key_pos-key_length,key_length))
  1962.     {
  1963.       /* Duplicated found ; Remove the row */
  1964.       if ((error=file->delete_row(record)))
  1965. goto err;
  1966.     }
  1967.     (void) hash_insert(&hash, key_pos-key_length);
  1968.     key_pos+=extra_length;
  1969.   }
  1970.   my_free((char*) key_buffer,MYF(0));
  1971.   hash_free(&hash);
  1972.   file->extra(HA_EXTRA_NO_CACHE);
  1973.   (void) file->rnd_end();
  1974.   DBUG_RETURN(0);
  1975. err:
  1976.   my_free((char*) key_buffer,MYF(0));
  1977.   hash_free(&hash);
  1978.   file->extra(HA_EXTRA_NO_CACHE);
  1979.   (void) file->rnd_end();
  1980.   if (error)
  1981.     file->print_error(error,MYF(0));
  1982.   DBUG_RETURN(1);
  1983. }
  1984. SORT_FIELD *make_unireg_sortorder(ORDER *order, uint *length)
  1985. {
  1986.   uint count;
  1987.   SORT_FIELD *sort,*pos;
  1988.   DBUG_ENTER("make_unireg_sortorder");
  1989.   count=0;
  1990.   for (ORDER *tmp = order; tmp; tmp=tmp->next)
  1991.     count++;
  1992.   pos=sort=(SORT_FIELD*) sql_alloc(sizeof(SORT_FIELD)*(count+1));
  1993.   if (!pos)
  1994.     return 0;
  1995.   for (;order;order=order->next,pos++)
  1996.   {
  1997.     pos->field=0; pos->item=0;
  1998.     if (order->item[0]->type() == Item::FIELD_ITEM)
  1999.       pos->field= ((Item_field*) (*order->item))->field;
  2000.     else if (order->item[0]->type() == Item::SUM_FUNC_ITEM &&
  2001.      !order->item[0]->const_item())
  2002.       pos->field= ((Item_sum*) order->item[0])->tmp_table_field();
  2003.     else if (order->item[0]->type() == Item::COPY_STR_ITEM)
  2004.     { // Blob patch
  2005.       pos->item= ((Item_copy_string*) (*order->item))->item;
  2006.     }
  2007.     else
  2008.       pos->item= *order->item;
  2009.     pos->reverse=! order->asc;
  2010.   }
  2011.   *length=count;
  2012.   DBUG_RETURN(sort);
  2013. }
  2014. /*****************************************************************************
  2015. ** Fill join cache with packed records
  2016. ** Records are stored in tab->cache.buffer and last record in
  2017. ** last record is stored with pointers to blobs to support very big
  2018. ** records
  2019. ******************************************************************************/
  2020. static int
  2021. join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count)
  2022. {
  2023.   reg1 uint i;
  2024.   uint length,blobs,size;
  2025.   CACHE_FIELD *copy,**blob_ptr;
  2026.   JOIN_CACHE  *cache;
  2027.   DBUG_ENTER("join_init_cache");
  2028.   cache= &tables[table_count].cache;
  2029.   cache->fields=blobs=0;
  2030.   for (i=0 ; i < table_count ; i++)
  2031.   {
  2032.     cache->fields+=tables[i].used_fields;
  2033.     blobs+=tables[i].used_blobs;
  2034.   }
  2035.   if (!(cache->field=(CACHE_FIELD*)
  2036. sql_alloc(sizeof(CACHE_FIELD)*(cache->fields+table_count*2)+(blobs+1)*
  2037.   sizeof(CACHE_FIELD*))))
  2038.   {
  2039.     my_free((gptr) cache->buff,MYF(0)); /* purecov: inspected */
  2040.     cache->buff=0; /* purecov: inspected */
  2041.     DBUG_RETURN(1); /* purecov: inspected */
  2042.   }
  2043.   copy=cache->field;
  2044.   blob_ptr=cache->blob_ptr=(CACHE_FIELD**)
  2045.     (cache->field+cache->fields+table_count*2);
  2046.   length=0;
  2047.   for (i=0 ; i < table_count ; i++)
  2048.   {
  2049.     uint null_fields=0,used_fields;
  2050.     Field **f_ptr,*field;
  2051.     for (f_ptr=tables[i].table->field,used_fields=tables[i].used_fields ;
  2052.  used_fields ;
  2053.  f_ptr++)
  2054.     {
  2055.       field= *f_ptr;
  2056.       if (field->query_id == thd->query_id)
  2057.       {
  2058. used_fields--;
  2059. length+=field->fill_cache_field(copy);
  2060. if (copy->blob_field)
  2061.   (*blob_ptr++)=copy;
  2062. if (field->maybe_null())
  2063.   null_fields++;
  2064. copy++;
  2065.       }
  2066.     }
  2067.     /* Copy null bits from table */
  2068.     if (null_fields && tables[i].table->null_fields)
  2069.     { /* must copy null bits */
  2070.       copy->str=(char*) tables[i].table->null_flags;
  2071.       copy->length=(tables[i].table->null_fields+7)/8;
  2072.       copy->strip=0;
  2073.       copy->blob_field=0;
  2074.       length+=copy->length;
  2075.       copy++;
  2076.       cache->fields++;
  2077.     }
  2078.     /* If outer join table, copy null_row flag */
  2079.     if (tables[i].table->maybe_null)
  2080.     {
  2081.       copy->str= (char*) &tables[i].table->null_row;
  2082.       copy->length=sizeof(tables[i].table->null_row);
  2083.       copy->strip=0;
  2084.       copy->blob_field=0;
  2085.       length+=copy->length;
  2086.       copy++;
  2087.       cache->fields++;
  2088.     }
  2089.   }
  2090.   cache->records=0; cache->ptr_record= (uint) ~0;
  2091.   cache->length=length+blobs*sizeof(char*);
  2092.   cache->blobs=blobs;
  2093.   *blob_ptr=0; /* End sequentel */
  2094.   size=max(join_buff_size,cache->length);
  2095.   if (!(cache->buff=(uchar*) my_malloc(size,MYF(0))))
  2096.     DBUG_RETURN(1); /* Don't use cache */ /* purecov: inspected */
  2097.   cache->end=cache->buff+size;
  2098.   reset_cache(cache);
  2099.   DBUG_RETURN(0);
  2100. }
  2101. static ulong
  2102. used_blob_length(CACHE_FIELD **ptr)
  2103. {
  2104.   uint length,blob_length;
  2105.   for (length=0 ; *ptr ; ptr++)
  2106.   {
  2107.     (*ptr)->blob_length=blob_length=(*ptr)->blob_field->get_length();
  2108.     length+=blob_length;
  2109.     (*ptr)->blob_field->get_ptr(&(*ptr)->str);
  2110.   }
  2111.   return length;
  2112. }
  2113. static bool
  2114. store_record_in_cache(JOIN_CACHE *cache)
  2115. {
  2116.   ulong length;
  2117.   uchar *pos;
  2118.   CACHE_FIELD *copy,*end_field;
  2119.   bool last_record;
  2120.   pos=cache->pos;
  2121.   end_field=cache->field+cache->fields;
  2122.   length=cache->length;
  2123.   if (cache->blobs)
  2124.     length+=used_blob_length(cache->blob_ptr);
  2125.   if ((last_record=(length+cache->length > (uint) (cache->end - pos))))
  2126.     cache->ptr_record=cache->records;
  2127.   /*
  2128.   ** There is room in cache. Put record there
  2129.   */
  2130.   cache->records++;
  2131.   for (copy=cache->field ; copy < end_field; copy++)
  2132.   {
  2133.     if (copy->blob_field)
  2134.     {
  2135.       if (last_record)
  2136.       {
  2137. copy->blob_field->get_image((char*) pos,copy->length+sizeof(char*));
  2138. pos+=copy->length+sizeof(char*);
  2139.       }
  2140.       else
  2141.       {
  2142. copy->blob_field->get_image((char*) pos,copy->length); // blob length
  2143. memcpy(pos+copy->length,copy->str,copy->blob_length);  // Blob data
  2144. pos+=copy->length+copy->blob_length;
  2145.       }
  2146.     }
  2147.     else
  2148.     {
  2149.       if (copy->strip)
  2150.       {
  2151. char *str,*end;
  2152. for (str=copy->str,end= str+copy->length;
  2153.      end > str && end[-1] == ' ' ;
  2154.      end--) ;
  2155. length=(uint) (end-str);
  2156. memcpy(pos+1,str,length);
  2157. *pos=(uchar) length;
  2158. pos+=length+1;
  2159.       }
  2160.       else
  2161.       {
  2162. memcpy(pos,copy->str,copy->length);
  2163. pos+=copy->length;
  2164.       }
  2165.     }
  2166.   }
  2167.   cache->pos=pos;
  2168.   return last_record || (uint) (cache->end -pos) < cache->length;
  2169. }
  2170. static void
  2171. reset_cache(JOIN_CACHE *cache)
  2172. {
  2173.   cache->record_nr=0;
  2174.   cache->pos=cache->buff;
  2175. }
  2176. static void
  2177. read_cached_record(JOIN_TAB *tab)
  2178. {
  2179.   uchar *pos;
  2180.   uint length;
  2181.   bool last_record;
  2182.   CACHE_FIELD *copy,*end_field;
  2183.   last_record=tab->cache.record_nr++ == tab->cache.ptr_record;
  2184.   pos=tab->cache.pos;
  2185.   for (copy=tab->cache.field,end_field=copy+tab->cache.fields ;
  2186.        copy < end_field;
  2187.        copy++)
  2188.   {
  2189.     if (copy->blob_field)
  2190.     {
  2191.       if (last_record)
  2192.       {
  2193. copy->blob_field->set_image((char*) pos,copy->length+sizeof(char*));
  2194. pos+=copy->length+sizeof(char*);
  2195.       }
  2196.       else
  2197.       {
  2198. copy->blob_field->set_ptr((char*) pos,(char*) pos+copy->length);
  2199. pos+=copy->length+copy->blob_field->get_length();
  2200.       }
  2201.     }
  2202.     else
  2203.     {
  2204.       if (copy->strip)
  2205.       {
  2206. memcpy(copy->str,pos+1,length=(uint) *pos);
  2207. memset(copy->str+length,' ',copy->length-length);
  2208. pos+=1+length;
  2209.       }
  2210.       else
  2211.       {
  2212. memcpy(copy->str,pos,copy->length);
  2213. pos+=copy->length;
  2214.       }
  2215.     }
  2216.   }
  2217.   tab->cache.pos=pos;
  2218.   return;
  2219. }
  2220. static bool
  2221. cmp_buffer_with_ref(JOIN_TAB *tab)
  2222. {
  2223.   bool diff;
  2224.   if (!(diff=tab->ref.key_err))
  2225.   {
  2226.     memcpy(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length);
  2227.   }
  2228.   if ((tab->ref.key_err=cp_buffer_from_ref(&tab->ref)) || diff)
  2229.     return 1;
  2230.   return memcmp(tab->ref.key_buff2, tab->ref.key_buff, tab->ref.key_length)
  2231.     != 0;
  2232. }
  2233. bool
  2234. cp_buffer_from_ref(TABLE_REF *ref)
  2235. {
  2236.   for (store_key **copy=ref->key_copy ; *copy ; copy++)
  2237.     if ((*copy)->copy())
  2238.       return 1; // Something went wrong
  2239.   return 0;
  2240. }
  2241. /*****************************************************************************
  2242. ** Group and order functions
  2243. *****************************************************************************/
  2244. /*
  2245. ** Find order/group item in requested columns and change the item to point at
  2246. ** it. If item doesn't exists, add it first in the field list
  2247. ** Return 0 if ok.
  2248. */
  2249. static int
  2250. find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List<Item> &fields,
  2251.    List<Item> &all_fields)
  2252. {
  2253.   if ((*order->item)->type() == Item::INT_ITEM)
  2254.   { /* Order by position */
  2255.     Item *item=0;
  2256.     List_iterator<Item> li(fields);
  2257.     for (uint count= (uint) ((Item_int*) (*order->item))->value ;
  2258.  count-- && (item=li++) ;) ;
  2259.     if (!item)
  2260.     {
  2261.       my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),
  2262.       MYF(0),(*order->item)->full_name(),
  2263.        thd->where);
  2264.       return 1;
  2265.     }
  2266.     order->item=li.ref();
  2267.     order->in_field_list=1;
  2268.     return 0;
  2269.   }
  2270.   const char *save_where=thd->where;
  2271.   thd->where=0; // No error if not found
  2272.   Item **item=find_item_in_list(*order->item,fields);
  2273.   thd->where=save_where;
  2274.   if (item)
  2275.   {
  2276.     order->item=item; // use it
  2277.     order->in_field_list=1;
  2278.     return 0;
  2279.   }
  2280.   order->in_field_list=0;
  2281.   if ((*order->item)->fix_fields(thd,tables) || thd->fatal_error)
  2282.     return 1; // Wrong field
  2283.   all_fields.push_front(*order->item); // Add new field to field list
  2284.   order->item=(Item**) all_fields.head_ref();
  2285.   return 0;
  2286. }
  2287. /*
  2288. ** Change order to point at item in select list. If item isn't a number
  2289. ** and doesn't exits in the select list, add it the the field list.
  2290. */
  2291. int setup_order(THD *thd,TABLE_LIST *tables,List<Item> &fields,
  2292.      List<Item> &all_fields, ORDER *order)
  2293. {
  2294.   thd->where="order clause";
  2295.   for (; order; order=order->next)
  2296.   {
  2297.     if (find_order_in_list(thd,tables,order,fields,all_fields))
  2298.       return 1;
  2299.   }
  2300.   return 0;
  2301. }
  2302. static int
  2303. setup_group(THD *thd,TABLE_LIST *tables,List<Item> &fields,
  2304.     List<Item> &all_fields, ORDER *order, bool *hidden_group_fields)
  2305. {
  2306.   *hidden_group_fields=0;
  2307.   if (!order)
  2308.     return 0; /* Everything is ok */
  2309.   if (thd->options & OPTION_ANSI_MODE)
  2310.   {
  2311.     Item *item;
  2312.     List_iterator<Item> li(fields);
  2313.     while ((item=li++))
  2314.       item->marker=0; /* Marker that field is not used */
  2315.   }
  2316.   uint org_fields=all_fields.elements;
  2317.   thd->where="group statement";
  2318.   for ( ; order; order=order->next)
  2319.   {
  2320.     if (find_order_in_list(thd,tables,order,fields,all_fields))
  2321.       return 1;
  2322.     (*order->item)->marker=1; /* Mark found */
  2323.     if ((*order->item)->with_sum_func)
  2324.     {
  2325.       my_printf_error(ER_WRONG_GROUP_FIELD, ER(ER_WRONG_GROUP_FIELD),MYF(0),
  2326.       (*order->item)->full_name());
  2327.       return 1;
  2328.     }
  2329.   }
  2330.   if (thd->options & OPTION_ANSI_MODE)
  2331.   {
  2332.     /* Don't allow one to use fields that is not used in GROUP BY */
  2333.     Item *item;
  2334.     List_iterator<Item> li(fields);
  2335.     while ((item=li++))
  2336.     {
  2337.       if (item->type() != Item::SUM_FUNC_ITEM && !item->marker)
  2338.       {
  2339. my_printf_error(ER_WRONG_FIELD_WITH_GROUP,
  2340. ER(ER_WRONG_FIELD_WITH_GROUP),
  2341. MYF(0),item->full_name());
  2342. return 1;
  2343.       }
  2344.     }
  2345.   }
  2346.   if (org_fields != all_fields.elements)
  2347.     *hidden_group_fields=1; // group fields is not used
  2348.   return 0;
  2349. }
  2350. /*
  2351. ** Add fields with aren't used at start of field list. Return FALSE if ok
  2352. */
  2353. static bool
  2354. setup_new_fields(THD *thd,TABLE_LIST *tables,List<Item> &fields,
  2355.  List<Item> &all_fields, ORDER *new_field)
  2356. {
  2357.   Item   **item;
  2358.   DBUG_ENTER("setup_new_fields");
  2359.   thd->set_query_id=1; // Not really needed, but...
  2360.   thd->where=0; // Don't give error
  2361.   for ( ; new_field ; new_field=new_field->next)
  2362.   {
  2363.     if ((item=find_item_in_list(*new_field->item,fields)))
  2364.       new_field->item=item; /* Change to shared Item */
  2365.     else
  2366.     {
  2367.       thd->where="procedure list";
  2368.       if ((*new_field->item)->fix_fields(thd,tables))
  2369. DBUG_RETURN(1); /* purecov: inspected */
  2370.       thd->where=0;
  2371.       all_fields.push_front(*new_field->item);
  2372.       new_field->item=all_fields.head_ref();
  2373.     }
  2374.   }
  2375.   DBUG_RETURN(0);
  2376. }
  2377. /*
  2378. ** Create a group by that consist of all non const fields. Try to use
  2379. ** the fields in the order given by 'order' to allow one to optimize
  2380. ** away 'order by'.
  2381. */
  2382. static ORDER *
  2383. create_distinct_group(ORDER *order_list,List<Item> &fields)
  2384. {
  2385.   List_iterator<Item> li(fields);
  2386.   Item *item;
  2387.   ORDER *order,*group,**prev;
  2388.   while ((item=li++))
  2389.     item->marker=0; /* Marker that field is not used */
  2390.   prev= &group;  group=0;
  2391.   for (order=order_list ; order; order=order->next)
  2392.   {
  2393.     if (order->in_field_list)
  2394.     {
  2395.       ORDER *ord=(ORDER*) sql_memdup(order,sizeof(ORDER));
  2396.       if (!ord)
  2397. return 0;
  2398.       *prev=ord;
  2399.       prev= &ord->next;
  2400.       (*ord->item)->marker=1;
  2401.     }
  2402.   }
  2403.   li.rewind();
  2404.   while ((item=li++))
  2405.   {
  2406.     if (item->const_item() || item->with_sum_func)
  2407.       continue;
  2408.     if (!item->marker)
  2409.     {
  2410.       ORDER *ord=(ORDER*) sql_calloc(sizeof(ORDER));
  2411.       if (!ord)
  2412. return 0;
  2413.       ord->item=li.ref();
  2414.       ord->asc=1;
  2415.       *prev=ord;
  2416.       prev= &ord->next;
  2417.     }
  2418.   }
  2419.   *prev=0;
  2420.   return group;
  2421. }
  2422. /*****************************************************************************
  2423. ** Update join with count of the different type of fields
  2424. *****************************************************************************/
  2425. void
  2426. count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
  2427.   bool reset_with_sum_func)
  2428. {
  2429.   List_iterator<Item> li(fields);
  2430.   Item *field;
  2431.   param->field_count=param->sum_func_count=param->func_count= 
  2432.     param->hidden_field_count=0;
  2433.   param->quick_group=1;
  2434.   while ((field=li++))
  2435.   {
  2436.     Item::Type type=field->type();
  2437.     if (type == Item::FIELD_ITEM)
  2438.       param->field_count++;
  2439.     else if (type == Item::SUM_FUNC_ITEM)
  2440.     {
  2441.       if (! field->const_item())
  2442.       {
  2443. Item_sum *sum_item=(Item_sum*) field;
  2444. if (!sum_item->quick_group)
  2445.   param->quick_group=0; // UDF SUM function
  2446. param->sum_func_count++;
  2447. for (uint i=0 ; i < sum_item->arg_count ; i++)
  2448. {
  2449.   if (sum_item->args[0]->type() == Item::FIELD_ITEM)
  2450.     param->field_count++;
  2451.   else
  2452.     param->func_count++;
  2453. }
  2454.       }
  2455.     }
  2456.     else
  2457.     {
  2458.       param->func_count++;
  2459.       if (reset_with_sum_func)
  2460. field->with_sum_func=0;
  2461.     }
  2462.   }
  2463. }
  2464. /*
  2465.   Return 1 if second is a subpart of first argument
  2466.   If first parts has different direction, change it to second part
  2467.   (group is sorted like order)
  2468. */
  2469. static bool
  2470. test_if_subpart(ORDER *a,ORDER *b)
  2471. {
  2472.   for (; a && b; a=a->next,b=b->next)
  2473.   {
  2474.     if ((*a->item)->eq(*b->item))
  2475.       a->asc=b->asc;
  2476.     else
  2477.       return 0;
  2478.   }
  2479.   return test(!b);
  2480. }
  2481. /*
  2482.   Return table number if there is only one table in sort order
  2483.   and group and order is compatible
  2484.   else return 0;
  2485. */
  2486. static TABLE *
  2487. get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables)
  2488. {
  2489.   table_map map= (table_map) 0;
  2490.   DBUG_ENTER("get_sort_by_table");
  2491.   if (!a)
  2492.     a=b; // Only one need to be given
  2493.   else if (!b)
  2494.     b=a;
  2495.   for (; a && b; a=a->next,b=b->next)
  2496.   {
  2497.     if (!(*a->item)->eq(*b->item))
  2498.       DBUG_RETURN(0);
  2499.     map|=a->item[0]->used_tables();
  2500.   }
  2501.   if (!map || (map & RAND_TABLE_BIT))
  2502.     DBUG_RETURN(0);
  2503.   for ( ; !(map & tables->table->map) ; tables=tables->next) ;
  2504.   if (map != tables->table->map)
  2505.     DBUG_RETURN(0); // More than one table
  2506.   DBUG_PRINT("exit",("sort by table: %d",tables->table->tablenr));
  2507.   DBUG_RETURN(tables->table);
  2508. }
  2509. /* calc how big buffer we need for comparing group entries */
  2510. static void
  2511. calc_group_buffer(JOIN *join,ORDER *group)
  2512. {
  2513.   uint key_length=0,parts=0;
  2514.   if (group)
  2515.     join->group= 1;
  2516.   for (; group ; group=group->next)
  2517.   {
  2518.     Field *field=(*group->item)->tmp_table_field();
  2519.     if (field)
  2520.     {
  2521.       if (field->type() == FIELD_TYPE_BLOB)
  2522. key_length+=MAX_BLOB_WIDTH; // Can't be used as a key
  2523.       else
  2524. key_length+=field->pack_length();
  2525.     }
  2526.     else if ((*group->item)->result_type() == REAL_RESULT)
  2527.       key_length+=sizeof(double);
  2528.     else if ((*group->item)->result_type() == INT_RESULT)
  2529.       key_length+=sizeof(longlong);
  2530.     else
  2531.       key_length+=(*group->item)->max_length;
  2532.     parts++;
  2533.     if ((*group->item)->maybe_null)
  2534.       key_length++;
  2535.   }
  2536.   join->tmp_table_param.group_length=key_length;
  2537.   join->tmp_table_param.group_parts=parts;
  2538. }
  2539. /*
  2540. ** Get a list of buffers for saveing last group
  2541. ** Groups are saved in reverse order for easyer check loop
  2542. */
  2543. static bool
  2544. alloc_group_fields(JOIN *join,ORDER *group)
  2545. {
  2546.   if (group)
  2547.   {
  2548.     for (; group ; group=group->next)
  2549.     {
  2550.       Item_buff *tmp=new_Item_buff(*group->item);
  2551.       if (!tmp || join->group_fields.push_front(tmp))
  2552. return TRUE;
  2553.     }
  2554.   }
  2555.   join->sort_and_group=1; /* Mark for do_select */
  2556.   return FALSE;
  2557. }
  2558. static int
  2559. test_if_group_changed(List<Item_buff> &list)
  2560. {
  2561.   List_iterator<Item_buff> li(list);
  2562.   int idx= -1,i;
  2563.   Item_buff *buff;
  2564.   for (i=(int) list.elements-1 ; (buff=li++) ; i--)
  2565.   {
  2566.     if (buff->cmp())
  2567.       idx=i;
  2568.   }
  2569.   return idx;
  2570. }
  2571. /*
  2572. ** Setup copy_fields to save fields at start of new group
  2573. ** Only FIELD_ITEM:s and FUNC_ITEM:s needs to be saved between groups.
  2574. ** Change old item_field to use a new field with points at saved fieldvalue
  2575. ** This function is only called before use of send_fields
  2576. */
  2577. bool
  2578. setup_copy_fields(TMP_TABLE_PARAM *param,List<Item> &fields)
  2579. {
  2580.   Item *pos;
  2581.   List_iterator<Item> li(fields);
  2582.   Copy_field *copy;
  2583.   DBUG_ENTER("setup_copy_fields");
  2584.   if (!(copy=param->copy_field= new Copy_field[param->field_count]))
  2585.     goto err;
  2586.   param->copy_funcs.empty();
  2587.   while ((pos=li++))
  2588.   {
  2589.     if (pos->type() == Item::FIELD_ITEM)
  2590.     {
  2591.       Item_field *item=(Item_field*) pos;
  2592.       if (item->field->flags & BLOB_FLAG)
  2593.       {
  2594. if (!(pos=new Item_copy_string(pos)))
  2595.   goto err;
  2596. VOID(li.replace(pos));
  2597. if (param->copy_funcs.push_back(pos))
  2598.   goto err;
  2599. continue;
  2600.       }
  2601.       /* set up save buffer and change result_field to point at saved value */
  2602.       Field *field= item->field;
  2603.       item->result_field=field->new_field(field->table);
  2604.       char *tmp=(char*) sql_alloc(field->pack_length()+1);
  2605.       if (!tmp)
  2606. goto err;
  2607.       copy->set(tmp, item->result_field);
  2608.       item->result_field->move_field(copy->to_ptr,copy->to_null_ptr,1);
  2609.       copy++;
  2610.     }
  2611.     else if ((pos->type() == Item::FUNC_ITEM ||
  2612.       pos->type() == Item::COND_ITEM) &&
  2613.      !pos->with_sum_func)
  2614.     { // Save for send fields
  2615.       /* TODO:
  2616.  In most cases this result will be sent to the user.
  2617.  This should be changed to use copy_int or copy_real depending
  2618.  on how the value is to be used: In some cases this may be an
  2619.  argument in a group function, like: IF(ISNULL(col),0,COUNT(*))
  2620.       */
  2621.       if (!(pos=new Item_copy_string(pos)))
  2622. goto err;
  2623.       VOID(li.replace(pos));
  2624.       if (param->copy_funcs.push_back(pos))
  2625. goto err;
  2626.     }
  2627.   }
  2628.   param->copy_field_count= (uint) (copy - param->copy_field);
  2629.   DBUG_RETURN(0);
  2630.  err:
  2631.   delete [] param->copy_field;
  2632.   param->copy_field=0;
  2633.   DBUG_RETURN(TRUE);
  2634. }
  2635. /*
  2636. ** Copy fields and null values between two tables
  2637. */
  2638. void
  2639. copy_fields(TMP_TABLE_PARAM *param)
  2640. {
  2641.   Copy_field *ptr=param->copy_field;
  2642.   Copy_field *end=ptr+param->copy_field_count;
  2643.   for ( ; ptr != end; ptr++)
  2644.     (*ptr->do_copy)(ptr);
  2645.   List_iterator<Item> it(param->copy_funcs);
  2646.   Item_copy_string *item;
  2647.   while ((item = (Item_copy_string*) it++))
  2648.   {
  2649.     item->copy();
  2650.   }
  2651. }
  2652. /*****************************************************************************
  2653. ** Make an array of pointer to sum_functions to speed up sum_func calculation
  2654. *****************************************************************************/
  2655. static bool
  2656. make_sum_func_list(JOIN *join,List<Item> &fields)
  2657. {
  2658.   DBUG_ENTER("make_sum_func_list");
  2659.   Item_sum **func =
  2660.     (Item_sum**) sql_alloc(sizeof(Item_sum*)*
  2661.    (join->tmp_table_param.sum_func_count+1));
  2662.   if (!func)
  2663.     DBUG_RETURN(TRUE);
  2664.   List_iterator<Item> it(fields);
  2665.   join->sum_funcs=func;
  2666.   Item *field;
  2667.   while ((field=it++))
  2668.   {
  2669.     if (field->type() == Item::SUM_FUNC_ITEM && !field->const_item())
  2670.     {
  2671.       *func++=(Item_sum*) field;
  2672.       /* let COUNT(DISTINCT) create the temporary table */
  2673.       if (((Item_sum*) field)->setup(join->thd))
  2674. DBUG_RETURN(TRUE);
  2675.     }
  2676.   }
  2677.   *func=0; // End marker
  2678.   DBUG_RETURN(FALSE);
  2679. }
  2680. /*
  2681. ** Change all funcs and sum_funcs to fields in tmp table
  2682. */
  2683. static bool
  2684. change_to_use_tmp_fields(List<Item> &items)
  2685. {
  2686.   List_iterator<Item> it(items);
  2687.   Item *item_field,*item;
  2688.   while ((item=it++))
  2689.   {
  2690.     Field *field;
  2691.     if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
  2692.       continue;
  2693.     if (item->type() == Item::FIELD_ITEM)
  2694.     {
  2695.       ((Item_field*) item)->field=
  2696. ((Item_field*) item)->result_field;
  2697.     }
  2698.     else if ((field=item->tmp_table_field()))
  2699.     {
  2700.       if (item->type() == Item::SUM_FUNC_ITEM && field->table->group)
  2701. item_field=((Item_sum*) item)->result_item(field);
  2702.       else
  2703. item_field=(Item*) new Item_field(field);
  2704.       if (!item_field)
  2705. return TRUE; // Fatal error
  2706.       item_field->name=item->name; /*lint -e613 */
  2707. #ifndef DBUG_OFF
  2708.       if (_db_on_ && !item_field->name)
  2709.       {
  2710. char buff[256];
  2711. String str(buff,sizeof(buff));
  2712. str.length(0);
  2713. item->print(&str);
  2714. item_field->name=sql_strmake(str.ptr(),str.length());
  2715.       }
  2716. #endif
  2717. #ifdef DELETE_ITEMS
  2718.       delete it.replace(item_field); /*lint -e613 */
  2719. #else
  2720.       (void) it.replace(item_field); /*lint -e613 */
  2721. #endif
  2722.     }
  2723.   }
  2724.   return FALSE;
  2725. }
  2726. /*
  2727. ** Change all sum_func refs to fields to point at fields in tmp table
  2728. ** Change all funcs to be fields in tmp table
  2729. */
  2730. static bool
  2731. change_refs_to_tmp_fields(THD *thd,List<Item> &items)
  2732. {
  2733.   List_iterator<Item> it(items);
  2734.   Item *item;
  2735.   while ((item= it++))
  2736.   {
  2737.     if (item->type() == Item::SUM_FUNC_ITEM)
  2738.     {
  2739.       if (!item->const_item())
  2740.       {
  2741. Item_sum *sum_item= (Item_sum*) item;
  2742. if (sum_item->result_field) // If not a const sum func
  2743. {
  2744.   Field *result_field=sum_item->result_field;
  2745.   for (uint i=0 ; i < sum_item->arg_count ; i++)
  2746.   {
  2747.     Item *arg= sum_item->args[i];
  2748.     if (!arg->const_item())
  2749.     {
  2750.       if (arg->type() == Item::FIELD_ITEM)
  2751. ((Item_field*) arg)->field= result_field++;
  2752.       else
  2753. sum_item->args[i]= new Item_field(result_field++);
  2754.     }
  2755.   }
  2756. }
  2757.       }
  2758.     }
  2759.     else if (item->with_sum_func)
  2760.       continue;
  2761.     else if ((item->type() == Item::FUNC_ITEM ||
  2762.       item->type() == Item::COND_ITEM) &&
  2763.      !item->const_item())
  2764.     { /* All funcs are stored */
  2765. #ifdef DELETE_ITEMS
  2766.       delete it.replace(new Item_field(((Item_func*) item)->result_field));
  2767. #else
  2768.       (void) it.replace(new Item_field(((Item_func*) item)->result_field));
  2769. #endif
  2770.     }
  2771.     else if (item->type() == Item::FIELD_ITEM) /* Change refs */
  2772.     {
  2773.       ((Item_field*)item)->field=((Item_field*) item)->result_field;
  2774.     }
  2775.   }
  2776.   return thd->fatal_error;
  2777. }
  2778. /******************************************************************************
  2779. ** code for calculating functions
  2780. ******************************************************************************/
  2781. static void
  2782. init_tmptable_sum_functions(Item_sum **func_ptr)
  2783. {
  2784.   Item_sum *func;
  2785.   while ((func= *(func_ptr++)))
  2786.     func->reset_field();
  2787. }
  2788. /* Update record 0 in tmp_table from record 1 */
  2789. static void
  2790. update_tmptable_sum_func(Item_sum **func_ptr,
  2791.  TABLE *tmp_table __attribute__((unused)))
  2792. {
  2793.   Item_sum *func;
  2794.   while ((func= *(func_ptr++)))
  2795.     func->update_field(0);
  2796. }
  2797. /* Copy result of sum functions to record in tmp_table */
  2798. static void
  2799. copy_sum_funcs(Item_sum **func_ptr)
  2800. {
  2801.   Item_sum *func;
  2802.   for (; (func = *func_ptr) ; func_ptr++)
  2803.     (void) func->save_in_field(func->result_field);
  2804.   return;
  2805. }
  2806. static void
  2807. init_sum_functions(Item_sum **func_ptr)
  2808. {
  2809.   Item_sum *func;
  2810.   for (; (func= (Item_sum*) *func_ptr) ; func_ptr++)
  2811.     func->reset();
  2812. }
  2813. static bool
  2814. update_sum_func(Item_sum **func_ptr)
  2815. {
  2816.   Item_sum *func;
  2817.   for (; (func= (Item_sum*) *func_ptr) ; func_ptr++)
  2818.     if (func->add())
  2819.       return 1;
  2820.   return 0;
  2821. }
  2822. /* Copy result of functions to record in tmp_table */
  2823. void
  2824. copy_funcs(Item_result_field **func_ptr)
  2825. {
  2826.   Item_result_field *func;
  2827.   for (; (func = *func_ptr) ; func_ptr++)
  2828.     (void) func->save_in_field(func->result_field);
  2829.   return;
  2830. }
  2831. /*****************************************************************************
  2832. ** Create a condition for a const reference and add this to the
  2833. ** currenct select for the table
  2834. *****************************************************************************/
  2835. static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab)
  2836. {
  2837.   DBUG_ENTER("add_ref_to_table_cond");
  2838.   if (!join_tab->ref.key_parts)
  2839.     DBUG_RETURN(FALSE);
  2840.   Item_cond_and *cond=new Item_cond_and();
  2841.   TABLE *table=join_tab->table;
  2842.   int error;
  2843.   if (!cond)
  2844.     DBUG_RETURN(TRUE);
  2845.   for (uint i=0 ; i < join_tab->ref.key_parts ; i++)
  2846.   {
  2847.     Field *field=table->field[table->key_info[join_tab->ref.key].key_part[i].fieldnr-1];
  2848.     Item *value=join_tab->ref.items[i];
  2849.     cond->add(new Item_func_equal(new Item_field(field),value));
  2850.   }
  2851.   if (thd->fatal_error)
  2852.     DBUG_RETURN(TRUE);
  2853.   /*
  2854.     Here we pass 0 as the first argument to fix_fields that don't need
  2855.     to do any stack checking (This is already done in the initial fix_fields).
  2856.   */
  2857.   cond->fix_fields((THD *) 0,(TABLE_LIST *) 0);
  2858.   if (join_tab->select)
  2859.   {
  2860.     error=(int) cond->add(join_tab->select->cond);
  2861.     join_tab->select_cond=join_tab->select->cond=cond;
  2862.   }
  2863.   else if ((join_tab->select=make_select(join_tab->table, 0, 0, cond,&error)))
  2864.     join_tab->select_cond=cond;
  2865.   DBUG_RETURN(error ? TRUE : FALSE);
  2866. }
  2867. /****************************************************************************
  2868. ** Send a description about what how the select will be done to stdout
  2869. ****************************************************************************/
  2870. static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
  2871.     bool distinct)
  2872. {
  2873.   List<Item> field_list;
  2874.   Item *item;
  2875.   THD *thd=join->thd;
  2876.   DBUG_ENTER("select_describe");
  2877.   /* Don't log this into the slow query log */
  2878.   join->thd->lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
  2879.   field_list.push_back(new Item_empty_string("table",NAME_LEN));
  2880.   field_list.push_back(new Item_empty_string("type",10));
  2881.   field_list.push_back(item=new Item_empty_string("possible_keys",
  2882.   NAME_LEN*MAX_KEY));
  2883.   item->maybe_null=1;
  2884.   field_list.push_back(item=new Item_empty_string("key",NAME_LEN));
  2885.   item->maybe_null=1;
  2886.   field_list.push_back(item=new Item_int("key_len",0,3));
  2887.   item->maybe_null=1;
  2888.   field_list.push_back(item=new Item_empty_string("ref",
  2889.   NAME_LEN*MAX_REF_PARTS));
  2890.   item->maybe_null=1;
  2891.   field_list.push_back(new Item_real("rows",0.0,0,10));
  2892.   field_list.push_back(new Item_empty_string("Extra",255));
  2893.   if (send_fields(thd,field_list,1))
  2894.     return; /* purecov: inspected */
  2895.   char buff[512],*buff_ptr;
  2896.   String tmp(buff,sizeof(buff)),*packet= &thd->packet;
  2897.   table_map used_tables=0;
  2898.   for (uint i=0 ; i < join->tables ; i++)
  2899.   {
  2900.     JOIN_TAB *tab=join->join_tab+i;
  2901.     TABLE *table=tab->table;
  2902.     if (tab->type == JT_ALL && tab->select && tab->select->quick)
  2903.       tab->type= JT_RANGE;
  2904.     packet->length(0);
  2905.     net_store_data(packet,table->table_name);
  2906.     net_store_data(packet,join_type_str[tab->type]);
  2907.     tmp.length(0);
  2908.     key_map bits;
  2909.     uint j;
  2910.     for (j=0,bits=tab->keys ; bits ; j++,bits>>=1)
  2911.     {
  2912.       if (bits & 1)
  2913.       {
  2914. if (tmp.length())
  2915.   tmp.append(',');
  2916. tmp.append(table->key_info[j].name);
  2917.       }
  2918.     }
  2919.     if (tmp.length())
  2920.       net_store_data(packet,tmp.ptr(),tmp.length());
  2921.     else
  2922.       net_store_null(packet);
  2923.     if (tab->ref.key_parts)
  2924.     {
  2925.       net_store_data(packet,table->key_info[tab->ref.key].name);
  2926.       net_store_data(packet,(uint32) tab->ref.key_length);
  2927.       tmp.length(0);
  2928.       for (store_key **ref=tab->ref.key_copy ; *ref ; ref++)
  2929.       {
  2930. if (tmp.length())
  2931.   tmp.append(',');
  2932. tmp.append((*ref)->name());
  2933.       }
  2934.       net_store_data(packet,tmp.ptr(),tmp.length());
  2935.     }
  2936.     else if (tab->type == JT_NEXT)
  2937.     {
  2938.       net_store_data(packet,table->key_info[tab->index].name);
  2939.       net_store_data(packet,(uint32) table->key_info[tab->index].key_length);
  2940.       net_store_null(packet);
  2941.     }
  2942.     else if (tab->select && tab->select->quick)
  2943.     {
  2944.       net_store_data(packet,table->key_info[tab->select->quick->index].name);;
  2945.       net_store_data(packet,(uint32) tab->select->quick->max_used_key_length);
  2946.       net_store_null(packet);
  2947.     }
  2948.     else
  2949.     {
  2950.       net_store_null(packet);
  2951.       net_store_null(packet);
  2952.       net_store_null(packet);
  2953.     }
  2954.     sprintf(buff,"%.0f",join->best_positions[i].records_read);
  2955.     net_store_data(packet,buff);
  2956.     my_bool key_read=table->key_read;
  2957.     if (tab->type == JT_NEXT &&
  2958. ((table->used_keys & ((key_map) 1 << tab->index))))
  2959.       key_read=1;
  2960.     buff_ptr=buff;
  2961.     if (tab->info)
  2962.       net_store_data(packet,tab->info);
  2963.     else if (tab->select)
  2964.     {
  2965.       if (tab->use_quick == 2)
  2966.       {
  2967. sprintf(buff_ptr,"range checked for each record (index map: %u)",
  2968. tab->keys);
  2969. buff_ptr=strend(buff_ptr);
  2970.       }
  2971.       else
  2972. buff_ptr=strmov(buff_ptr,"where used");
  2973.     }
  2974.     if (key_read)
  2975.     {
  2976.       if (buff != buff_ptr)
  2977.       {
  2978. buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
  2979.       }
  2980.       buff_ptr=strmov(buff_ptr,"Using index");
  2981.     }
  2982.     if (table->reginfo.not_exists_optimize)
  2983.     {
  2984.       if (buff != buff_ptr)
  2985.       {
  2986. buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
  2987.       }
  2988.       buff_ptr=strmov(buff_ptr,"Not exists");
  2989.     }
  2990.     if (need_tmp_table)
  2991.     {
  2992.       need_tmp_table=0;
  2993.       if (buff != buff_ptr)
  2994.       {
  2995. buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
  2996.       }
  2997.       buff_ptr=strmov(buff_ptr,"Using temporary");
  2998.     }
  2999.     if (need_order)
  3000.     {
  3001.       need_order=0;
  3002.       if (buff != buff_ptr)
  3003.       {
  3004. buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
  3005.       }
  3006.       buff_ptr=strmov(buff_ptr,"Using filesort");
  3007.     }
  3008.     if (distinct & test_all_bits(used_tables,thd->used_tables))
  3009.     {
  3010.       if (buff != buff_ptr)
  3011.       {
  3012. buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
  3013.       }
  3014.       buff_ptr=strmov(buff_ptr,"Distinct");
  3015.     }
  3016.     net_store_data(packet,buff,(uint) (buff_ptr - buff));
  3017.     if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
  3018.       DBUG_VOID_RETURN; /* purecov: inspected */
  3019.     // For next iteration
  3020.     used_tables|=table->map;
  3021.   }
  3022.   send_eof(&thd->net);
  3023.   DBUG_VOID_RETURN;
  3024. }
  3025. static void describe_info(THD *thd, const char *info)
  3026. {
  3027.   List<Item> field_list;
  3028.   String *packet= &thd->packet;
  3029.   /* Don't log this into the slow query log */
  3030.   thd->lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
  3031.   field_list.push_back(new Item_empty_string("Comment",80));
  3032.   if (send_fields(thd,field_list,1))
  3033.     return; /* purecov: inspected */
  3034.   packet->length(0);
  3035.   net_store_data(packet,info);
  3036.   if (!my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
  3037.     send_eof(&thd->net);
  3038. }