summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mronstrom@mysql.com>2005-05-12 11:20:50 +0200
committerunknown <mronstrom@mysql.com>2005-05-12 11:20:50 +0200
commit5985904e73aadcad42436096c184532f9a126603 (patch)
treedd39471954acb216773d29d2fd1ceb2a6f1651ab /sql
parentf8b75e07a53058b0e5f1e0dad9188604ab6cde9b (diff)
downloadmariadb-git-5985904e73aadcad42436096c184532f9a126603.tar.gz
Many fixes
Diffstat (limited to 'sql')
-rw-r--r--sql/handler.cc139
-rw-r--r--sql/handler.h117
-rw-r--r--sql/opt_range.cc11
-rw-r--r--sql/sql_bitmap.h11
-rw-r--r--sql/sql_select.cc10
5 files changed, 132 insertions, 156 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index 7125cae062c..653fc07b34d 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1357,16 +1357,17 @@ int handler::ha_initialise()
int handler::ha_allocate_read_write_set(ulong no_fields)
{
+ uint bitmap_size= 4*(((no_fields+1)+31)/32);
+ uchar *read_buf, *write_buf;
DBUG_ENTER("ha_allocate_read_write_set");
DBUG_PRINT("info", ("no_fields = %d", no_fields));
- read_set= new bitvector;
- write_set= new bitvector;
- if (!read_set || !write_set)
- {
- ha_deallocate_read_write_set();
- DBUG_RETURN(TRUE);
- }
- if (read_set->init(no_fields+1) || write_set->init(no_fields+1))
+ read_set= (MY_BITMAP*)sql_alloc(sizeof(MY_BITMAP));
+ write_set= (MY_BITMAP*)sql_alloc(sizeof(MY_BITMAP));
+ read_buf= (uchar*)sql_alloc(bitmap_size);
+ write_buf= (uchar*)sql_alloc(bitmap_size);
+ DBUG_ASSERT(!bitmap_init(read_set, read_buf, (no_fields+1), FALSE));
+ DBUG_ASSERT(!bitmap_init(write_set, write_buf, (no_fields+1), FALSE));
+ if (!read_set || !write_set || !read_buf || !write_buf)
{
ha_deallocate_read_write_set();
DBUG_RETURN(TRUE);
@@ -1378,8 +1379,6 @@ int handler::ha_allocate_read_write_set(ulong no_fields)
void handler::ha_deallocate_read_write_set()
{
DBUG_ENTER("ha_deallocate_read_write_set");
- delete read_set;
- delete write_set;
read_set=write_set=0;
DBUG_VOID_RETURN;
}
@@ -1387,127 +1386,17 @@ void handler::ha_deallocate_read_write_set()
void handler::ha_clear_all_set()
{
DBUG_ENTER("ha_clear_all_set");
- read_set->clear_all();
- write_set->clear_all();
- read_set->set_bit((uint)0);
- write_set->set_bit((uint)0);
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_set_all_bits_in_read_set()
-{
- DBUG_ENTER("ha_set_all_bits_in_read_set");
- read_set->set_all();
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_set_all_bits_in_write_set()
-{
- DBUG_ENTER("ha_set_all_bits_in_write_set");
- write_set->set_all();
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_set_bit_in_read_set(uint fieldnr)
-{
- DBUG_ENTER("ha_set_bit_in_read_set");
- DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
- read_set->set_bit((size_t)fieldnr);
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_clear_bit_in_read_set(uint fieldnr)
-{
- DBUG_ENTER("ha_clear_bit_in_read_set");
- DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
- read_set->clear_bit((size_t)fieldnr);
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_set_bit_in_write_set(uint fieldnr)
-{
- DBUG_ENTER("ha_set_bit_in_write_set");
- DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
- write_set->set_bit((size_t)fieldnr);
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_clear_bit_in_write_set(uint fieldnr)
-{
- DBUG_ENTER("ha_clear_bit_in_write_set");
- DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
- write_set->clear_bit((size_t)fieldnr);
- DBUG_VOID_RETURN;
-}
-
-void handler::ha_set_bit_in_rw_set(uint fieldnr, bool write_op)
-{
- DBUG_ENTER("ha_set_bit_in_rw_set");
- if (!write_op) {
- DBUG_PRINT("info", ("Set bit %u in read set", fieldnr));
- read_set->set_bit((size_t)fieldnr);
- }
- else
- {
- DBUG_PRINT("info", ("Set bit %u in read and write set", fieldnr));
- read_set->set_bit((size_t)fieldnr);
- write_set->set_bit((size_t)fieldnr);
- }
+ bitmap_clear_all(read_set);
+ bitmap_clear_all(write_set);
+ bitmap_set_bit(read_set, 0);
+ bitmap_set_bit(write_set, 0);
DBUG_VOID_RETURN;
}
-bool handler::ha_get_bit_in_read_set(uint fieldnr)
-{
- bool bit_set=read_set->get_bit((size_t)fieldnr);
- DBUG_ENTER("ha_get_bit_in_read_set");
- DBUG_PRINT("info", ("bit %u = %u", fieldnr, bit_set));
- DBUG_RETURN(bit_set);
-}
-
-bool handler::ha_get_bit_in_write_set(uint fieldnr)
-{
- bool bit_set=write_set->get_bit((size_t)fieldnr);
- DBUG_ENTER("ha_get_bit_in_write_set");
- DBUG_PRINT("info", ("bit %u = %u", fieldnr, bit_set));
- DBUG_RETURN(bit_set);
-}
-
-bool handler::ha_get_all_bit_in_read_set()
-{
- bool bit_set=read_set->get_all_bits_set();
- DBUG_ENTER("ha_get_all_bit_in_read_set");
- DBUG_PRINT("info", ("all bits set = %u", bit_set));
- DBUG_RETURN(bit_set);
-}
-
-bool handler::ha_get_all_bit_in_read_clear()
-{
- bool bit_set=read_set->get_all_bits_clear();
- DBUG_ENTER("ha_get_all_bit_in_read_clear");
- DBUG_PRINT("info", ("all bits clear = %u", bit_set));
- DBUG_RETURN(bit_set);
-}
-
-bool handler::ha_get_all_bit_in_write_set()
-{
- bool bit_set=write_set->get_all_bits_set();
- DBUG_ENTER("ha_get_all_bit_in_write_set");
- DBUG_PRINT("info", ("all bits set = %u", bit_set));
- DBUG_RETURN(bit_set);
-}
-
-bool handler::ha_get_all_bit_in_write_clear()
-{
- bool bit_set=write_set->get_all_bits_clear();
- DBUG_ENTER("ha_get_all_bit_in_write_clear");
- DBUG_PRINT("info", ("all bits clear = %u", bit_set));
- DBUG_RETURN(bit_set);
-}
-
int handler::ha_retrieve_all_cols()
{
DBUG_ENTER("handler::ha_retrieve_all_cols");
- read_set->set_all();
+ bitmap_set_all(read_set);
DBUG_RETURN(0);
}
diff --git a/sql/handler.h b/sql/handler.h
index 16f9364a3d2..9818e2dc01d 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -486,8 +486,8 @@ public:
bool auto_increment_column_changed;
bool implicit_emptied; /* Can be !=0 only if HEAP */
const COND *pushed_cond;
- bitvector *read_set;
- bitvector *write_set;
+ MY_BITMAP *read_set;
+ MY_BITMAP *write_set;
handler(TABLE *table_arg) :table(table_arg),
ref(0), data_file_length(0), max_data_file_length(0), index_file_length(0),
@@ -497,7 +497,7 @@ public:
key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
ref_length(sizeof(my_off_t)), block_size(0),
raid_type(0), ft_handler(0), inited(NONE), implicit_emptied(0),
- pushed_cond(NULL), read_set(0), write_set(0)
+ pushed_cond(NULL)
{}
virtual ~handler(void)
{
@@ -597,24 +597,107 @@ public:
*/
virtual int ha_retrieve_all_cols();
virtual int ha_retrieve_all_pk();
- void ha_set_all_bits_in_read_set();
- void ha_set_all_bits_in_write_set();
- void ha_set_bit_in_read_set(uint fieldnr);
- void ha_clear_bit_in_read_set(uint fieldnr);
- void ha_set_bit_in_write_set(uint fieldnr);
- void ha_clear_bit_in_write_set(uint fieldnr);
- void ha_set_bit_in_rw_set(uint fieldnr, bool write_set);
- bool ha_get_bit_in_read_set(uint fieldnr);
- bool ha_get_bit_in_write_set(uint fieldnr);
- bool ha_get_all_bit_in_read_set();
- bool ha_get_all_bit_in_read_clear();
- bool ha_get_all_bit_in_write_set();
- bool ha_get_all_bit_in_write_clear();
+ void ha_set_all_bits_in_read_set()
+ {
+ DBUG_ENTER("ha_set_all_bits_in_read_set");
+ bitmap_set_all(read_set);
+ DBUG_VOID_RETURN;
+ }
+ void ha_set_all_bits_in_write_set()
+ {
+ DBUG_ENTER("ha_set_all_bits_in_write_set");
+ bitmap_set_all(write_set);
+ DBUG_VOID_RETURN;
+ }
+ void ha_set_bit_in_read_set(uint fieldnr)
+ {
+ DBUG_ENTER("ha_set_bit_in_read_set");
+ DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
+ bitmap_set_bit(read_set, fieldnr);
+ DBUG_VOID_RETURN;
+ }
+ void ha_clear_bit_in_read_set(uint fieldnr)
+ {
+ DBUG_ENTER("ha_clear_bit_in_read_set");
+ DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
+ bitmap_clear_bit(read_set, fieldnr);
+ DBUG_VOID_RETURN;
+ }
+ void ha_set_bit_in_write_set(uint fieldnr)
+ {
+ DBUG_ENTER("ha_set_bit_in_write_set");
+ DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
+ bitmap_set_bit(write_set, fieldnr);
+ DBUG_VOID_RETURN;
+ }
+ void ha_clear_bit_in_write_set(uint fieldnr)
+ {
+ DBUG_ENTER("ha_clear_bit_in_write_set");
+ DBUG_PRINT("info", ("fieldnr = %d", fieldnr));
+ bitmap_clear_bit(write_set, fieldnr);
+ DBUG_VOID_RETURN;
+ }
+ void ha_set_bit_in_rw_set(uint fieldnr, bool write_op)
+ {
+ DBUG_ENTER("ha_set_bit_in_rw_set");
+ DBUG_PRINT("info", ("Set bit %u in read set", fieldnr));
+ bitmap_set_bit(read_set, fieldnr);
+ if (!write_op) {
+ DBUG_VOID_RETURN;
+ }
+ else
+ {
+ DBUG_PRINT("info", ("Set bit %u in read and write set", fieldnr));
+ bitmap_set_bit(write_set, fieldnr);
+ }
+ DBUG_VOID_RETURN;
+ }
+ bool ha_get_bit_in_read_set(uint fieldnr)
+ {
+ bool bit_set=bitmap_is_set(read_set,fieldnr);
+ DBUG_ENTER("ha_get_bit_in_read_set");
+ DBUG_PRINT("info", ("bit %u = %u", fieldnr, bit_set));
+ DBUG_RETURN(bit_set);
+ }
+ bool ha_get_bit_in_write_set(uint fieldnr)
+ {
+ bool bit_set=bitmap_is_set(write_set,fieldnr);
+ DBUG_ENTER("ha_get_bit_in_write_set");
+ DBUG_PRINT("info", ("bit %u = %u", fieldnr, bit_set));
+ DBUG_RETURN(bit_set);
+ }
+ bool ha_get_all_bit_in_read_set()
+ {
+ bool all_bits_set= bitmap_is_set_all(read_set);
+ DBUG_ENTER("ha_get_all_bit_in_read_set");
+ DBUG_PRINT("info", ("all bits set = %u", all_bits_set));
+ DBUG_RETURN(all_bits_set);
+ }
+ bool ha_get_all_bit_in_read_clear()
+ {
+ bool all_bits_set= bitmap_is_clear_all(read_set);
+ DBUG_ENTER("ha_get_all_bit_in_read_clear");
+ DBUG_PRINT("info", ("all bits clear = %u", all_bits_set));
+ DBUG_RETURN(all_bits_set);
+ }
+ bool ha_get_all_bit_in_write_set()
+ {
+ bool all_bits_set= bitmap_is_set_all(write_set);
+ DBUG_ENTER("ha_get_all_bit_in_write_set");
+ DBUG_PRINT("info", ("all bits set = %u", all_bits_set));
+ DBUG_RETURN(all_bits_set);
+ }
+ bool ha_get_all_bit_in_write_clear()
+ {
+ bool all_bits_set= bitmap_is_clear_all(write_set);
+ DBUG_ENTER("ha_get_all_bit_in_write_clear");
+ DBUG_PRINT("info", ("all bits clear = %u", all_bits_set));
+ DBUG_RETURN(all_bits_set);
+ }
void ha_set_primary_key_in_read_set();
int ha_allocate_read_write_set(ulong no_fields);
void ha_deallocate_read_write_set();
void ha_clear_all_set();
-
uint get_index(void) const { return active_index; }
virtual int open(const char *name, int mode, uint test_if_locked)=0;
virtual int close(void)=0;
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 48f2e95c7a4..634c833e554 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1566,7 +1566,8 @@ static int fill_used_fields_bitmap(PARAM *param)
param->fields_bitmap_size= (table->s->fields/8 + 1);
uchar *tmp;
uint pk;
- if (!(tmp= (uchar*)alloc_root(param->mem_root,param->fields_bitmap_size)) ||
+ if (!(tmp= (uchar*)alloc_root(param->mem_root,
+ bytes_word_aligned(param->fields_bitmap_size))) ||
bitmap_init(&param->needed_fields, tmp, param->fields_bitmap_size*8,
FALSE))
return 1;
@@ -2321,7 +2322,7 @@ ROR_SCAN_INFO *make_ror_scan(const PARAM *param, int idx, SEL_ARG *sel_arg)
ror_scan->records= param->table->quick_rows[keynr];
if (!(bitmap_buf= (uchar*)alloc_root(param->mem_root,
- param->fields_bitmap_size)))
+ bytes_word_aligned(param->fields_bitmap_size))))
DBUG_RETURN(NULL);
if (bitmap_init(&ror_scan->covered_fields, bitmap_buf,
@@ -2441,7 +2442,8 @@ ROR_INTERSECT_INFO* ror_intersect_init(const PARAM *param)
sizeof(ROR_INTERSECT_INFO))))
return NULL;
info->param= param;
- if (!(buf= (uchar*)alloc_root(param->mem_root, param->fields_bitmap_size)))
+ if (!(buf= (uchar*)alloc_root(param->mem_root,
+ bytes_word_aligned(param->fields_bitmap_size))))
return NULL;
if (bitmap_init(&info->covered_fields, buf, param->fields_bitmap_size*8,
FALSE))
@@ -2998,7 +3000,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
/*I=set of all covering indexes */
ror_scan_mark= tree->ror_scans;
- uchar buf[MAX_KEY/8+1];
+ uint32 int_buf[MAX_KEY/32+1];
+ uchar *buf= (uchar*)&int_buf;
MY_BITMAP covered_fields;
if (bitmap_init(&covered_fields, buf, nbits, FALSE))
DBUG_RETURN(0);
diff --git a/sql/sql_bitmap.h b/sql/sql_bitmap.h
index 5c51f3ecb67..37c74b4ea91 100644
--- a/sql/sql_bitmap.h
+++ b/sql/sql_bitmap.h
@@ -25,7 +25,7 @@
template <uint default_width> class Bitmap
{
MY_BITMAP map;
- uchar buffer[(default_width+7)/8];
+ uint32 buffer[(default_width+31)/32];
public:
Bitmap() { init(); }
Bitmap(Bitmap& from) { *this=from; }
@@ -62,17 +62,18 @@ public:
char *print(char *buf) const
{
char *s=buf; int i;
+ uchar *uchar_buffer= (uchar*)&buffer;
for (i=sizeof(buffer)-1; i>=0 ; i--)
{
- if ((*s=_dig_vec_upper[buffer[i] >> 4]) != '0')
+ if ((*s=_dig_vec_upper[uchar_buffer[i] >> 4]) != '0')
break;
- if ((*s=_dig_vec_upper[buffer[i] & 15]) != '0')
+ if ((*s=_dig_vec_upper[uchar_buffer[i] & 15]) != '0')
break;
}
for (s++, i-- ; i>=0 ; i--)
{
- *s++=_dig_vec_upper[buffer[i] >> 4];
- *s++=_dig_vec_upper[buffer[i] & 15];
+ *s++=_dig_vec_upper[uchar_buffer[i] >> 4];
+ *s++=_dig_vec_upper[uchar_buffer[i] & 15];
}
*s=0;
return buf;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 348d0b578a1..5555029f928 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -7946,7 +7946,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
statistic_increment(thd->status_var.created_tmp_tables, &LOCK_status);
if (use_temp_pool)
- temp_pool_slot = bitmap_set_next(&temp_pool);
+ temp_pool_slot = bitmap_lock_set_next(&temp_pool);
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
sprintf(filename, "%s_%lx_%i", tmp_file_prefix,
@@ -7998,12 +7998,12 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
param->group_length : 0,
NullS))
{
- bitmap_clear_bit(&temp_pool, temp_pool_slot);
+ bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
DBUG_RETURN(NULL); /* purecov: inspected */
}
if (!(param->copy_field=copy=new Copy_field[field_count]))
{
- bitmap_clear_bit(&temp_pool, temp_pool_slot);
+ bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
my_free((gptr) table,MYF(0)); /* purecov: inspected */
DBUG_RETURN(NULL); /* purecov: inspected */
}
@@ -8449,7 +8449,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
err:
free_tmp_table(thd,table); /* purecov: inspected */
- bitmap_clear_bit(&temp_pool, temp_pool_slot);
+ bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
DBUG_RETURN(NULL); /* purecov: inspected */
}
@@ -8723,7 +8723,7 @@ free_tmp_table(THD *thd, TABLE *entry)
my_free((gptr) entry->record[0],MYF(0));
free_io_cache(entry);
- bitmap_clear_bit(&temp_pool, entry->temp_pool_slot);
+ bitmap_lock_clear_bit(&temp_pool, entry->temp_pool_slot);
my_free((gptr) entry,MYF(0));
thd->proc_info=save_proc_info;