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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* Write some debug info */
  17. #include "mysql_priv.h"
  18. #include "sql_select.h"
  19. #include <hash.h>
  20. /* Intern key cache variables */
  21. extern "C" pthread_mutex_t THR_LOCK_keycache;
  22. #ifndef DBUG_OFF
  23. void
  24. print_where(COND *cond,const char *info)
  25. {
  26.   if (cond)
  27.   {
  28.     char buff[256];
  29.     String str(buff,(uint32) sizeof(buff));
  30.     str.length(0);
  31.     cond->print(&str);
  32.     str.append('');
  33.     DBUG_LOCK_FILE;
  34.     (void) fprintf(DBUG_FILE,"nWHERE:(%s) ",info);
  35.     (void) fputs(str.ptr(),DBUG_FILE);
  36.     (void) fputc('n',DBUG_FILE);
  37.     DBUG_UNLOCK_FILE;
  38.   }
  39. }
  40. /* This is for debugging purposes */
  41. extern HASH open_cache;
  42. extern TABLE *unused_tables;
  43. void print_cached_tables(void)
  44. {
  45.   uint idx,count,unused;
  46.   TABLE *start_link,*lnk;
  47.   VOID(pthread_mutex_lock(&LOCK_open));
  48.   puts("DB             Table                            Version  Thread  L.thread  Open");
  49.   for (idx=unused=0 ; idx < open_cache.records ; idx++)
  50.   {
  51.     TABLE *entry=(TABLE*) hash_element(&open_cache,idx);
  52.     printf("%-14.14s %-32s%6ld%8ld%10ld%6dn",
  53.    entry->table_cache_key,entry->real_name,entry->version,
  54.    entry->in_use ? entry->in_use->thread_id : 0L,
  55.    entry->in_use ? entry->in_use->dbug_thread_id : 0L,
  56.    entry->db_stat ? 1 : 0);
  57.     if (!entry->in_use)
  58.       unused++;
  59.   }
  60.   count=0;
  61.   if ((start_link=lnk=unused_tables))
  62.   {
  63.     do
  64.     {
  65.       if (lnk != lnk->next->prev || lnk != lnk->prev->next)
  66.       {
  67. printf("unused_links isn't linked properlyn");
  68. return;
  69.       }
  70.     } while (count++ < open_cache.records && (lnk=lnk->next) != start_link);
  71.     if (lnk != start_link)
  72.     {
  73.       printf("Unused_links aren't connectedn");
  74.     }
  75.   }
  76.   if (count != unused)
  77.     printf("Unused_links (%d) doesn't match open_cache: %dn", count,unused);
  78.   printf("nCurrent refresh version: %ldn",refresh_version);
  79.   if (hash_check(&open_cache))
  80.     printf("Error: File hash table is corruptedn");
  81.   fflush(stdout);
  82.   VOID(pthread_mutex_unlock(&LOCK_open));
  83.   return;
  84. }
  85. void TEST_filesort(TABLE **table,SORT_FIELD *sortorder,uint s_length,
  86.    ha_rows special)
  87. {
  88.   char buff[256],buff2[256];
  89.   String str(buff,sizeof(buff)),out(buff2,sizeof(buff2));
  90.   const char *sep;
  91.   DBUG_ENTER("TEST_filesort");
  92.   out.length(0);
  93.   for (sep=""; s_length-- ; sortorder++, sep=" ")
  94.   {
  95.     out.append(sep);
  96.     if (sortorder->reverse)
  97.       out.append('-');
  98.     if (sortorder->field)
  99.     {
  100.       if (sortorder->field->table_name)
  101.       {
  102. out.append(sortorder->field->table_name);
  103. out.append('.');
  104.       }
  105.       out.append(sortorder->field->field_name ? sortorder->field->field_name:
  106.  "tmp_table_column");
  107.     }
  108.     else
  109.     {
  110.       str.length(0);
  111.       sortorder->item->print(&str);
  112.       out.append(str);
  113.     }
  114.   }
  115.   out.append(''); // Purify doesn't like c_ptr()
  116.   DBUG_LOCK_FILE;
  117.   VOID(fputs("nInfo about FILESORTn",DBUG_FILE));
  118.   if (special)
  119.     fprintf(DBUG_FILE,"Records to sort: %ldn",special);
  120.   fprintf(DBUG_FILE,"Sortorder: %sn",out.ptr());
  121.   DBUG_UNLOCK_FILE;
  122.   DBUG_VOID_RETURN;
  123. }
  124. void
  125. TEST_join(JOIN *join)
  126. {
  127.   uint i,ref;
  128.   DBUG_ENTER("TEST_join");
  129.   DBUG_LOCK_FILE;
  130.   VOID(fputs("nInfo about JOINn",DBUG_FILE));
  131.   for (i=0 ; i < join->tables ; i++)
  132.   {
  133.     JOIN_TAB *tab=join->join_tab+i;
  134.     TABLE *form=tab->table;
  135.     fprintf(DBUG_FILE,"%-16.16s  type: %-7s  q_keys: %4d  refs: %d  key: %d  len: %dn",
  136.     form->table_name,
  137.     join_type_str[tab->type],
  138.     tab->keys,
  139.     tab->ref.key_parts,
  140.     tab->ref.key,
  141.     tab->ref.key_length);
  142.     if (tab->select)
  143.     {
  144.       if (tab->use_quick == 2)
  145. fprintf(DBUG_FILE,
  146. "                  quick select checked for each record (keys: %d)n",
  147. (int) tab->select->quick_keys);
  148.       else if (tab->select->quick)
  149. fprintf(DBUG_FILE,"                  quick select used on key %s, length: %dn",
  150. form->key_info[tab->select->quick->index].name,
  151. tab->select->quick->max_used_key_length);
  152.       else
  153. VOID(fputs("                  select usedn",DBUG_FILE));
  154.     }
  155.     if (tab->ref.key_parts)
  156.     {
  157.       VOID(fputs("                  refs: ",DBUG_FILE));
  158.       for (ref=0 ; ref < tab->ref.key_parts ; ref++)
  159.       {
  160. Item *item=tab->ref.items[ref];
  161. fprintf(DBUG_FILE,"%s  ", item->full_name());
  162.       }
  163.       VOID(fputc('n',DBUG_FILE));
  164.     }
  165.   }
  166.   DBUG_UNLOCK_FILE;
  167.   DBUG_VOID_RETURN;
  168. }
  169. #endif
  170. void mysql_print_status(THD *thd)
  171. {
  172.   printf("nStatus information:nn");
  173.   if (thd)
  174.     thd->proc_info="locks";
  175.   thr_print_locks(); // Write some debug info
  176. #ifndef DBUG_OFF
  177.   if (thd)
  178.     thd->proc_info="table cache";
  179.   print_cached_tables();
  180. #endif
  181.   /* Print key cache status */
  182.   if (thd)
  183.     thd->proc_info="key cache";
  184.   pthread_mutex_lock(&THR_LOCK_keycache);
  185.   printf("key_cache status:n
  186. blocks used:%10lun
  187. not flushed:%10lun
  188. w_requests: %10lun
  189. writes:     %10lun
  190. r_requests: %10lun
  191. reads:      %10lun",
  192.  _my_blocks_used,_my_blocks_changed,_my_cache_w_requests,
  193.  _my_cache_write,_my_cache_r_requests,_my_cache_read);
  194.   pthread_mutex_unlock(&THR_LOCK_keycache);
  195.   if (thd)
  196.     thd->proc_info="status";
  197.   pthread_mutex_lock(&LOCK_status);
  198.   printf("nhandler status:n
  199. read_key:   %10lun
  200. read_next:  %10lun
  201. read_rnd    %10lun
  202. read_first: %10lun
  203. write:      %10lun
  204. delete      %10lun
  205. update:     %10lun",
  206.  ha_read_key_count, ha_read_next_count,
  207.  ha_read_rnd_count, ha_read_first_count,
  208.  ha_write_count, ha_delete_count, ha_update_count);
  209.   pthread_mutex_unlock(&LOCK_status);
  210.   printf("nTable status:n
  211. Opened tables: %10lun
  212. Open tables:   %10lun
  213. Open files:    %10lun
  214. Open streams:  %10lun",
  215.  opened_tables,
  216.  (ulong) cached_tables(),
  217.  (ulong) my_file_opened,
  218.  (ulong) my_stream_opened);
  219.   fflush(stdout);
  220.   if (thd)
  221.     thd->proc_info="malloc";
  222.   TERMINATE(stdout); // Write malloc information
  223.   if (thd)
  224.     thd->proc_info=0;
  225. }