summaryrefslogtreecommitdiff
path: root/sql/sql_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_test.cc')
-rw-r--r--sql/sql_test.cc246
1 files changed, 246 insertions, 0 deletions
diff --git a/sql/sql_test.cc b/sql/sql_test.cc
new file mode 100644
index 00000000000..411a85a5c55
--- /dev/null
+++ b/sql/sql_test.cc
@@ -0,0 +1,246 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+/* Write some debug info */
+
+
+#include "mysql_priv.h"
+#include "sql_select.h"
+#include <hash.h>
+
+/* Intern key cache variables */
+extern "C" pthread_mutex_t THR_LOCK_keycache;
+
+#ifndef DBUG_OFF
+
+void
+print_where(COND *cond,const char *info)
+{
+ if (cond)
+ {
+ char buff[256];
+ String str(buff,(uint32) sizeof(buff));
+ str.length(0);
+ cond->print(&str);
+ str.append('\0');
+ DBUG_LOCK_FILE;
+ (void) fprintf(DBUG_FILE,"\nWHERE:(%s) ",info);
+ (void) fputs(str.ptr(),DBUG_FILE);
+ (void) fputc('\n',DBUG_FILE);
+ DBUG_UNLOCK_FILE;
+ }
+}
+
+ /* This is for debugging purposes */
+
+extern HASH open_cache;
+extern TABLE *unused_tables;
+
+void print_cached_tables(void)
+{
+ uint idx,count,unused;
+ TABLE *start_link,*lnk;
+
+ VOID(pthread_mutex_lock(&LOCK_open));
+ puts("DB Table Version Thread L.thread Open");
+
+ for (idx=unused=0 ; idx < open_cache.records ; idx++)
+ {
+ TABLE *entry=(TABLE*) hash_element(&open_cache,idx);
+ printf("%-14.14s %-32s%6ld%8ld%10ld%6d\n",
+ entry->table_cache_key,entry->real_name,entry->version,
+ entry->in_use ? entry->in_use->thread_id : 0L,
+ entry->in_use ? entry->in_use->dbug_thread_id : 0L,
+ entry->db_stat ? 1 : 0);
+ if (!entry->in_use)
+ unused++;
+ }
+ count=0;
+ if ((start_link=lnk=unused_tables))
+ {
+ do
+ {
+ if (lnk != lnk->next->prev || lnk != lnk->prev->next)
+ {
+ printf("unused_links isn't linked properly\n");
+ return;
+ }
+ } while (count++ < open_cache.records && (lnk=lnk->next) != start_link);
+ if (lnk != start_link)
+ {
+ printf("Unused_links aren't connected\n");
+ }
+ }
+ if (count != unused)
+ printf("Unused_links (%d) dosen't match open_cache: %d\n", count,unused);
+ printf("\nCurrent refresh version: %ld\n",refresh_version);
+ if (hash_check(&open_cache))
+ printf("Error: File hash table is corrupted\n");
+ fflush(stdout);
+ VOID(pthread_mutex_unlock(&LOCK_open));
+ return;
+}
+
+
+void TEST_filesort(TABLE **table,SORT_FIELD *sortorder,uint s_length,
+ ha_rows special)
+{
+ char buff[256],buff2[256];
+ String str(buff,sizeof(buff)),out(buff2,sizeof(buff2));
+ const char *sep;
+ DBUG_ENTER("TEST_filesort");
+
+ out.length(0);
+ for (sep=""; s_length-- ; sortorder++, sep=" ")
+ {
+ out.append(sep);
+ if (sortorder->reverse)
+ out.append('-');
+ if (sortorder->field)
+ {
+ if (sortorder->field->table_name)
+ {
+ out.append(sortorder->field->table_name);
+ out.append('.');
+ }
+ out.append(sortorder->field->field_name ? sortorder->field->field_name:
+ "tmp_table_column");
+ }
+ else
+ {
+ str.length(0);
+ sortorder->item->print(&str);
+ out.append(str);
+ }
+ }
+ out.append('\0'); // Purify doesn't like c_ptr()
+ DBUG_LOCK_FILE;
+ VOID(fputs("\nInfo about FILESORT\n",DBUG_FILE));
+ if (special)
+ fprintf(DBUG_FILE,"Records to sort: %ld\n",special);
+ fprintf(DBUG_FILE,"Sortorder: %s\n",out.ptr());
+ DBUG_UNLOCK_FILE;
+ DBUG_VOID_RETURN;
+}
+
+
+void
+TEST_join(JOIN *join)
+{
+ uint i,ref;
+ DBUG_ENTER("TEST_join");
+
+ DBUG_LOCK_FILE;
+ VOID(fputs("\nInfo about JOIN\n",DBUG_FILE));
+ for (i=0 ; i < join->tables ; i++)
+ {
+ JOIN_TAB *tab=join->join_tab+i;
+ TABLE *form=tab->table;
+ fprintf(DBUG_FILE,"%-16.16s type: %-7s q_keys: %4d refs: %d key: %d len: %d\n",
+ form->table_name,
+ join_type_str[tab->type],
+ tab->keys,
+ tab->ref.key_parts,
+ tab->ref.key,
+ tab->ref.key_length);
+ if (tab->select)
+ {
+ if (tab->use_quick == 2)
+ fprintf(DBUG_FILE,
+ " quick select checked for each record (keys: %d)\n",
+ (int) tab->select->quick_keys);
+ else if (tab->select->quick)
+ fprintf(DBUG_FILE," quick select used on key %s, length: %d\n",
+ form->key_info[tab->select->quick->index].name,
+ tab->select->quick->max_used_key_length);
+ else
+ VOID(fputs(" select used\n",DBUG_FILE));
+ }
+ if (tab->ref.key_parts)
+ {
+ VOID(fputs(" refs: ",DBUG_FILE));
+ for (ref=0 ; ref < tab->ref.key_parts ; ref++)
+ {
+ Item *item=tab->ref.items[ref];
+ fprintf(DBUG_FILE,"%s ", item->full_name());
+ }
+ VOID(fputc('\n',DBUG_FILE));
+ }
+ }
+ DBUG_UNLOCK_FILE;
+ DBUG_VOID_RETURN;
+}
+
+#endif
+
+void mysql_print_status(THD *thd)
+{
+ printf("\nStatus information:\n\n");
+ if (thd)
+ thd->proc_info="locks";
+ thr_print_locks(); // Write some debug info
+#ifndef DBUG_OFF
+ if (thd)
+ thd->proc_info="table cache";
+ print_cached_tables();
+#endif
+ /* Print key cache status */
+ if (thd)
+ thd->proc_info="key cache";
+ pthread_mutex_lock(&THR_LOCK_keycache);
+ printf("key_cache status:\n\
+blocks used:%10lu\n\
+not flushed:%10lu\n\
+w_requests: %10lu\n\
+writes: %10lu\n\
+r_requests: %10lu\n\
+reads: %10lu\n",
+ _my_blocks_used,_my_blocks_changed,_my_cache_w_requests,
+ _my_cache_write,_my_cache_r_requests,_my_cache_read);
+ pthread_mutex_unlock(&THR_LOCK_keycache);
+
+ if (thd)
+ thd->proc_info="status";
+ pthread_mutex_lock(&LOCK_status);
+ printf("\nhandler status:\n\
+read_key: %10lu\n\
+read_next: %10lu\n\
+read_rnd %10lu\n\
+read_first: %10lu\n\
+write: %10lu\n\
+delete %10lu\n\
+update: %10lu\n",
+ ha_read_key_count, ha_read_next_count,
+ ha_read_rnd_count, ha_read_first_count,
+ ha_write_count, ha_delete_count, ha_update_count);
+ pthread_mutex_unlock(&LOCK_status);
+ printf("\nTable status:\n\
+Opened tables: %10lu\n\
+Open tables: %10lu\n\
+Open files: %10lu\n\
+Open streams: %10lu\n",
+ opened_tables,
+ (ulong) cached_tables(),
+ (ulong) my_file_opened,
+ (ulong) my_stream_opened);
+ fflush(stdout);
+ if (thd)
+ thd->proc_info="malloc";
+ TERMINATE(stdout); // Write malloc information
+ if (thd)
+ thd->proc_info=0;
+}