summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/myisammrg.h2
-rw-r--r--myisammrg/myrg_info.c17
-rw-r--r--myisammrg/myrg_open.c22
-rw-r--r--sql/ha_myisammrg.cc7
4 files changed, 35 insertions, 13 deletions
diff --git a/include/myisammrg.h b/include/myisammrg.h
index c3b3b39424b..ea882450eef 100644
--- a/include/myisammrg.h
+++ b/include/myisammrg.h
@@ -51,6 +51,7 @@ typedef struct st_mymerge_info /* Struct from h_info */
uint reclength; /* Recordlength */
int errkey; /* With key was dupplicated on err */
uint options; /* HA_OPTION_... used */
+ ulong *rec_per_key; /* for sql optimizing */
} MYMERGE_INFO;
typedef struct st_myrg_table_info
@@ -71,6 +72,7 @@ typedef struct st_myrg_info
my_bool cache_in_use;
LIST open_list;
QUEUE by_key;
+ ulong *rec_per_key_part; /* for sql optimizing */
} MYRG_INFO;
diff --git a/myisammrg/myrg_info.c b/myisammrg/myrg_info.c
index 14bc228cc1f..ba840ac444b 100644
--- a/myisammrg/myrg_info.c
+++ b/myisammrg/myrg_info.c
@@ -28,8 +28,6 @@ ulonglong myrg_position(MYRG_INFO *info)
~(ulonglong) 0;
}
- /* If flag != 0 one only gets pos of last record */
-
int myrg_status(MYRG_INFO *info,register MYMERGE_INFO *x,int flag)
{
MYRG_TABLE *current_table;
@@ -55,15 +53,16 @@ int myrg_status(MYRG_INFO *info,register MYMERGE_INFO *x,int flag)
DBUG_PRINT("info2",("table: %s, offset: %lu",
file->table->filename,(ulong) file->file_offset));
}
- x->records = info->records;
- x->deleted = info->del;
- x->data_file_length = info->data_file_length;
- x->reclength = info->reclength;
- x->options = info->options;
+ x->records= info->records;
+ x->deleted= info->del;
+ x->data_file_length= info->data_file_length;
+ x->reclength= info->reclength;
+ x->options= info->options;
if (current_table)
- x->errkey = current_table->table->errkey;
+ x->errkey= current_table->table->errkey;
else
- x->errkey=0;
+ x->errkey= 0;
+ x->rec_per_key = info->rec_per_key_part;
}
DBUG_RETURN(0);
}
diff --git a/myisammrg/myrg_open.c b/myisammrg/myrg_open.c
index 9360f582958..6a3c8dd86d9 100644
--- a/myisammrg/myrg_open.c
+++ b/myisammrg/myrg_open.c
@@ -32,8 +32,8 @@
MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
{
- int save_errno,i,errpos;
- uint files,dir_length,length,options;
+ int save_errno,i,j,errpos;
+ uint files,dir_length,length,options, key_parts;
ulonglong file_offset;
char name_buff[FN_REFLEN*2],buff[FN_REFLEN],*end;
MYRG_INFO info,*m_info;
@@ -89,13 +89,25 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
}
info.reclength=isam->s->base.reclength;
}
+ key_parts=(isam ? isam->s->base.key_parts : 0);
if (!(m_info= (MYRG_INFO*) my_malloc(sizeof(MYRG_INFO)+
- files*sizeof(MYRG_TABLE),
+ files*sizeof(MYRG_TABLE)+
+ sizeof(long)*key_parts,
MYF(MY_WME))))
goto err;
*m_info=info;
- m_info->open_tables=(files) ? (MYRG_TABLE *) (m_info+1) : 0;
m_info->tables=files;
+ if (files)
+ {
+ m_info->open_tables=(MYRG_TABLE *) (m_info+1);
+ m_info->rec_per_key_part=(ulong *) (m_info->open_tables+files);
+ bzero((char*) m_info->rec_per_key_part,sizeof(long)*key_parts);
+ }
+ else
+ {
+ m_info->open_tables=0;
+ m_info->rec_per_key_part=0;
+ }
errpos=2;
options= (uint) ~0;
@@ -107,6 +119,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
m_info->records+=isam->state->records;
m_info->del+=isam->state->del;
m_info->data_file_length+=isam->state->data_file_length;
+ for (j=0; j < key_parts; j++)
+ m_info->rec_per_key_part[j]+=isam->s->state.rec_per_key_part[j] / files;
if (i)
isam=(MI_INFO*) (isam->open_list.next->data);
}
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index f2c3d1a7747..efebeb8b46d 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -229,6 +229,13 @@ void ha_myisammrg::info(uint flag)
#else
ref_length=4; // Can't be > than my_off_t
#endif
+ if (flag & HA_STATUS_CONST)
+ {
+ if (table->key_parts)
+ memcpy((char*) table->key_info[0].rec_per_key,
+ (char*) info.rec_per_key,
+ sizeof(table->key_info[0].rec_per_key)*table->key_parts);
+ }
}