Commit 8685094e authored by monty@tik.mysql.fi's avatar monty@tik.mysql.fi

Don't write rows in MyISAM tables when using count(distinct)

Don't read MyISAM header when running without locking
parent a3be64bf
...@@ -11,3 +11,4 @@ sasha@mysql.sashanet.com ...@@ -11,3 +11,4 @@ sasha@mysql.sashanet.com
serg@serg.mysql.com serg@serg.mysql.com
tim@threads.polyesthetic.msg tim@threads.polyesthetic.msg
tim@work.mysql.com tim@work.mysql.com
monty@tik.mysql.fi
...@@ -187,7 +187,7 @@ typedef struct st_columndef /* column information */ ...@@ -187,7 +187,7 @@ typedef struct st_columndef /* column information */
extern my_string myisam_log_filename; /* Name of logfile */ extern my_string myisam_log_filename; /* Name of logfile */
extern uint myisam_block_size; extern uint myisam_block_size;
extern my_bool myisam_flush,myisam_delay_key_write; extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
extern my_bool myisam_concurrent_insert; extern my_bool myisam_concurrent_insert;
extern my_off_t myisam_max_temp_length,myisam_max_extra_temp_length; extern my_off_t myisam_max_temp_length,myisam_max_extra_temp_length;
......
...@@ -412,12 +412,15 @@ int _mi_mark_file_changed(MI_INFO *info) ...@@ -412,12 +412,15 @@ int _mi_mark_file_changed(MI_INFO *info)
share->global_changed=1; share->global_changed=1;
share->state.open_count++; share->state.open_count++;
} }
if (!share->temporary)
{
mi_int2store(buff,share->state.open_count); mi_int2store(buff,share->state.open_count);
buff[2]=1; /* Mark that it's changed */ buff[2]=1; /* Mark that it's changed */
return (my_pwrite(share->kfile,buff,sizeof(buff), return (my_pwrite(share->kfile,buff,sizeof(buff),
sizeof(share->state.header), sizeof(share->state.header),
MYF(MY_NABP))); MYF(MY_NABP)));
} }
}
return 0; return 0;
} }
......
...@@ -777,6 +777,8 @@ uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead) ...@@ -777,6 +777,8 @@ uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead)
{ {
char buff[MI_STATE_INFO_SIZE + MI_STATE_EXTRA_SIZE]; char buff[MI_STATE_INFO_SIZE + MI_STATE_EXTRA_SIZE];
if (!myisam_single_user)
{
if (pRead) if (pRead)
{ {
if (my_pread(file, buff, state->state_length,0L, MYF(MY_NABP))) if (my_pread(file, buff, state->state_length,0L, MYF(MY_NABP)))
...@@ -785,6 +787,7 @@ uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead) ...@@ -785,6 +787,7 @@ uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead)
else if (my_read(file, buff, state->state_length,MYF(MY_NABP))) else if (my_read(file, buff, state->state_length,MYF(MY_NABP)))
return (MY_FILE_ERROR); return (MY_FILE_ERROR);
mi_state_info_read(buff, state); mi_state_info_read(buff, state);
}
return 0; return 0;
} }
......
...@@ -32,7 +32,7 @@ my_string myisam_log_filename=(char*) "myisam.log"; ...@@ -32,7 +32,7 @@ my_string myisam_log_filename=(char*) "myisam.log";
File myisam_log_file= -1; File myisam_log_file= -1;
uint myisam_quick_table_bits=9; uint myisam_quick_table_bits=9;
uint myisam_block_size=MI_KEY_BLOCK_LENGTH; /* Best by test */ uint myisam_block_size=MI_KEY_BLOCK_LENGTH; /* Best by test */
my_bool myisam_flush=0,myisam_delay_key_write=0; my_bool myisam_flush=0, myisam_delay_key_write=0, myisam_single_user=0;
#if defined(THREAD) && !defined(DONT_USE_RW_LOCKS) #if defined(THREAD) && !defined(DONT_USE_RW_LOCKS)
my_bool myisam_concurrent_insert=1; my_bool myisam_concurrent_insert=1;
#else #else
......
a b
1 2
2 3
3 5
4 5
5 5
6 6
7 7
8 9
FOUND_ROWS()
8
a b
1 2
FOUND_ROWS()
8
a b
8 9
FOUND_ROWS()
8
b
2
FOUND_ROWS()
6
b c
2 1
FOUND_ROWS()
6
a b a b
3 5 5 5
FOUND_ROWS()
8
#
# Testing of found_rows()
#
drop table if exists t1;
create table t1 (a int not null auto_increment, b int not null, primary key(a));
insert into t1 (b) values (2),(3),(5),(5),(5),(6),(7),(9);
select SQL_CALC_FOUND_ROWS * from t1;
select found_rows();
select SQL_CALC_FOUND_ROWS * from t1 limit 1;
select found_rows();
select SQL_CALC_FOUND_ROWS * from t1 order by b desc limit 1;
select found_rows();
select SQL_CALC_FOUND_ROWS distinct b from t1 limit 1;
select found_rows();
select SQL_CALC_FOUND_ROWS b,count(*) as c from t1 group by b order by c limit 1;
select found_rows();
select SQL_CALC_FOUND_ROWS * from t1 left join t1 as t2 on (t1.b=t2.a) limit 2,1;
select found_rows();
drop table t1;
...@@ -867,6 +867,7 @@ bool Item_sum_count_distinct::setup(THD *thd) ...@@ -867,6 +867,7 @@ bool Item_sum_count_distinct::setup(THD *thd)
0, 0, current_lex->options | thd->options))) 0, 0, current_lex->options | thd->options)))
return 1; return 1;
table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
table->no_rows=1;
if(table->db_type == DB_TYPE_HEAP) // no blobs, otherwise it would be if(table->db_type == DB_TYPE_HEAP) // no blobs, otherwise it would be
// MyISAM // MyISAM
......
...@@ -3028,14 +3028,13 @@ static void usage(void) ...@@ -3028,14 +3028,13 @@ static void usage(void)
puts("\ puts("\
-O, --set-variable var=option\n\ -O, --set-variable var=option\n\
Give a variable an value. --help lists variables\n\ Give a variable an value. --help lists variables\n\
-Sg, --skip-grant-tables\n\
Start without grant tables. This gives all users\n\
FULL ACCESS to all tables!\n\
--safe-mode Skip some optimize stages (for testing)\n\ --safe-mode Skip some optimize stages (for testing)\n\
--skip-concurrent-insert\n\ --skip-concurrent-insert\n\
Don't use concurrent insert with MyISAM\n\ Don't use concurrent insert with MyISAM\n\
--skip-delay-key-write\n\ --skip-delay-key-write\n\
Ignore the delay_key_write option for all tables\n\ Ignore the delay_key_write option for all tables\n\
--skip-grant-tables Start without grant tables. This gives all users\n\
FULL ACCESS to all tables!\n\
--skip-host-cache Don't cache host names\n\ --skip-host-cache Don't cache host names\n\
--skip-locking Don't use system locking. To use isamchk one has\n\ --skip-locking Don't use system locking. To use isamchk one has\n\
to shut down the server.\n\ to shut down the server.\n\
...@@ -3172,7 +3171,7 @@ static void set_options(void) ...@@ -3172,7 +3171,7 @@ static void set_options(void)
#endif #endif
#if defined( HAVE_mit_thread ) || defined( __WIN__ ) || defined( HAVE_LINUXTHREADS ) #if defined( HAVE_mit_thread ) || defined( __WIN__ ) || defined( HAVE_LINUXTHREADS )
my_disable_locking = 1; my_disable_locking=myisam_single_user= 1;
#endif #endif
my_bind_addr = htonl( INADDR_ANY ); my_bind_addr = htonl( INADDR_ANY );
} }
...@@ -3265,20 +3264,6 @@ static void get_options(int argc,char **argv) ...@@ -3265,20 +3264,6 @@ static void get_options(int argc,char **argv)
test_flags= optarg ? (uint) atoi(optarg) : 0; test_flags= optarg ? (uint) atoi(optarg) : 0;
opt_endinfo=1; opt_endinfo=1;
break; break;
case 'S':
if (!optarg)
opt_specialflag|= SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE;
else if (!strcmp(optarg,"l"))
my_disable_locking=1;
else if (!strcmp(optarg,"g"))
opt_noacl=1;
else
{
fprintf(stderr,"%s: Unrecognized option: %s\n",my_progname,optarg);
use_help();
exit(1);
}
break;
case (int) OPT_BIG_TABLES: case (int) OPT_BIG_TABLES:
thd_startup_options|=OPTION_BIG_TABLES; thd_startup_options|=OPTION_BIG_TABLES;
break; break;
...@@ -3456,7 +3441,7 @@ static void get_options(int argc,char **argv) ...@@ -3456,7 +3441,7 @@ static void get_options(int argc,char **argv)
opt_noacl=1; opt_noacl=1;
break; break;
case (int) OPT_SKIP_LOCK: case (int) OPT_SKIP_LOCK:
my_disable_locking=1; my_disable_locking=myisam_single_user= 1;
break; break;
case (int) OPT_SKIP_HOST_CACHE: case (int) OPT_SKIP_HOST_CACHE:
opt_specialflag|= SPECIAL_NO_HOST_CACHE; opt_specialflag|= SPECIAL_NO_HOST_CACHE;
...@@ -4022,7 +4007,7 @@ static int get_service_parameters() ...@@ -4022,7 +4007,7 @@ static int get_service_parameters()
} }
else if ( lstrcmp(szKeyValueName, TEXT("KeyBufferSize")) == 0 ) else if ( lstrcmp(szKeyValueName, TEXT("KeyBufferSize")) == 0 )
{ {
SET_CHANGEABLE_VARVAL( "key_buffer" ); SET_CHANGEABLE_VARVAL( "key_buffer_size" );
} }
else if ( lstrcmp(szKeyValueName, TEXT("LongQueryTime")) == 0 ) else if ( lstrcmp(szKeyValueName, TEXT("LongQueryTime")) == 0 )
{ {
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#pragma interface /* gcc class implementation */ #pragma interface /* gcc class implementation */
#endif #endif
#include <my_tree.h>
#define DEC_IN_AVG 4 #define DEC_IN_AVG 4
typedef struct st_number_info typedef struct st_number_info
......
...@@ -69,7 +69,7 @@ static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); ...@@ -69,7 +69,7 @@ static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value);
static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item);
static bool open_tmp_table(TABLE *table); static bool open_tmp_table(TABLE *table);
static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
uint options); ulong options);
static int do_select(JOIN *join,List<Item> *fields,TABLE *tmp_table, static int do_select(JOIN *join,List<Item> *fields,TABLE *tmp_table,
Procedure *proc); Procedure *proc);
static int sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records); static int sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records);
...@@ -3317,7 +3317,7 @@ Field *create_tmp_field(TABLE *table,Item *item, Item::Type type, ...@@ -3317,7 +3317,7 @@ Field *create_tmp_field(TABLE *table,Item *item, Item::Type type,
TABLE * TABLE *
create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
ORDER *group, bool distinct, bool save_sum_fields, ORDER *group, bool distinct, bool save_sum_fields,
bool allow_distinct_limit, uint select_options) bool allow_distinct_limit, ulong select_options)
{ {
TABLE *table; TABLE *table;
uint i,field_count,reclength,null_count,null_pack_length, uint i,field_count,reclength,null_count,null_pack_length,
...@@ -3759,7 +3759,7 @@ static bool open_tmp_table(TABLE *table) ...@@ -3759,7 +3759,7 @@ static bool open_tmp_table(TABLE *table)
static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
uint options) ulong options)
{ {
int error; int error;
MI_KEYDEF keydef; MI_KEYDEF keydef;
...@@ -3926,6 +3926,12 @@ bool create_myisam_from_heap(TABLE *table, TMP_TABLE_PARAM *param, int error, ...@@ -3926,6 +3926,12 @@ bool create_myisam_from_heap(TABLE *table, TMP_TABLE_PARAM *param, int error,
goto err1; goto err1;
table->file->index_end(); table->file->index_end();
table->file->rnd_init(); table->file->rnd_init();
if (table->no_rows)
{
new_table->file->extra(HA_EXTRA_NO_ROWS);
new_table->no_rows=1;
}
/* copy all old rows */ /* copy all old rows */
while (!table->file->rnd_next(new_table.record[1])) while (!table->file->rnd_next(new_table.record[1]))
{ {
......
...@@ -181,7 +181,7 @@ void TEST_join(JOIN *join); ...@@ -181,7 +181,7 @@ void TEST_join(JOIN *join);
bool store_val_in_field(Field *field,Item *val); bool store_val_in_field(Field *field,Item *val);
TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
ORDER *group, bool distinct, bool save_sum_fields, ORDER *group, bool distinct, bool save_sum_fields,
bool allow_distinct_limit, uint select_options); bool allow_distinct_limit, ulong select_options);
void free_tmp_table(THD *thd, TABLE *entry); void free_tmp_table(THD *thd, TABLE *entry);
void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
bool reset_with_sum_func); bool reset_with_sum_func);
......
...@@ -89,7 +89,7 @@ struct st_table { ...@@ -89,7 +89,7 @@ struct st_table {
my_bool copy_blobs; /* copy_blobs when storing */ my_bool copy_blobs; /* copy_blobs when storing */
my_bool null_row; /* All columns are null */ my_bool null_row; /* All columns are null */
my_bool maybe_null,outer_join; /* Used with OUTER JOIN */ my_bool maybe_null,outer_join; /* Used with OUTER JOIN */
my_bool distinct,const_table; my_bool distinct,const_table,no_rows;
my_bool key_read; my_bool key_read;
my_bool crypted; my_bool crypted;
my_bool db_low_byte_first; /* Portable row format */ my_bool db_low_byte_first; /* Portable row format */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment