mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
direct aggregate with index merge
This commit is contained in:
@@ -4763,6 +4763,7 @@ int spider_mysql_handler::init()
|
||||
st_spider_share *share = spider->share;
|
||||
int init_sql_alloc_size =
|
||||
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
|
||||
TABLE *table = spider->get_table();
|
||||
DBUG_ENTER("spider_mysql_handler::init");
|
||||
DBUG_PRINT("info",("spider this=%p", this));
|
||||
sql.init_calc_mem(59);
|
||||
@@ -4794,6 +4795,7 @@ int spider_mysql_handler::init()
|
||||
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
|
||||
&link_for_hash,
|
||||
sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
|
||||
&minimum_select_bitmap, sizeof(uchar) * no_bytes_in_map(table->read_set),
|
||||
NullS))
|
||||
) {
|
||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||
@@ -6071,10 +6073,12 @@ int spider_mysql_handler::append_minimum_select(
|
||||
int field_length;
|
||||
bool appended = FALSE;
|
||||
DBUG_ENTER("spider_mysql_handler::append_minimum_select");
|
||||
minimum_select_bitmap_create();
|
||||
for (field = table->field; *field; field++)
|
||||
{
|
||||
if (minimum_select_bit_is_set((*field)->field_index))
|
||||
{
|
||||
spider_set_bit(minimum_select_bitmap, (*field)->field_index);
|
||||
field_length =
|
||||
mysql_share->column_name_str[(*field)->field_index].length();
|
||||
if (str->reserve(field_length +
|
||||
@@ -6156,10 +6160,12 @@ int spider_mysql_handler::append_minimum_select_with_alias(
|
||||
int field_length;
|
||||
bool appended = FALSE;
|
||||
DBUG_ENTER("spider_mysql_handler::append_minimum_select_with_alias");
|
||||
minimum_select_bitmap_create();
|
||||
for (field = table->field; *field; field++)
|
||||
{
|
||||
if (minimum_select_bit_is_set((*field)->field_index))
|
||||
{
|
||||
spider_set_bit(minimum_select_bitmap, (*field)->field_index);
|
||||
field_length =
|
||||
mysql_share->column_name_str[(*field)->field_index].length();
|
||||
if (str->reserve(alias_length + field_length +
|
||||
@@ -11065,33 +11071,86 @@ bool spider_mysql_handler::support_use_handler(
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
void spider_mysql_handler::minimum_select_bitmap_create()
|
||||
{
|
||||
TABLE *table = spider->get_table();
|
||||
Field **field_p;
|
||||
DBUG_ENTER("spider_mysql_handler::minimum_select_bitmap_create");
|
||||
DBUG_PRINT("info",("spider this=%p", this));
|
||||
memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
|
||||
if (
|
||||
spider->has_clone_for_merge ||
|
||||
#ifdef HA_CAN_BULK_ACCESS
|
||||
(spider->is_clone && !spider->is_bulk_access_clone)
|
||||
#else
|
||||
spider->is_clone
|
||||
#endif
|
||||
) {
|
||||
/* need preparing for cmp_ref */
|
||||
TABLE_SHARE *table_share = table->s;
|
||||
if (
|
||||
table_share->primary_key == MAX_KEY
|
||||
) {
|
||||
/* need all columns */
|
||||
memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
|
||||
DBUG_VOID_RETURN;
|
||||
} else {
|
||||
/* need primary key columns */
|
||||
uint roop_count;
|
||||
KEY *key_info;
|
||||
KEY_PART_INFO *key_part;
|
||||
Field *field;
|
||||
key_info = &table_share->key_info[table_share->primary_key];
|
||||
key_part = key_info->key_part;
|
||||
for (roop_count = 0;
|
||||
roop_count < spider_user_defined_key_parts(key_info);
|
||||
roop_count++)
|
||||
{
|
||||
field = key_part[roop_count].field;
|
||||
spider_set_bit(minimum_select_bitmap, field->field_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (field_p = table->field; *field_p; field_p++)
|
||||
{
|
||||
uint field_index = (*field_p)->field_index;
|
||||
DBUG_PRINT("info",("spider field_index=%u", field_index));
|
||||
DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
|
||||
spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider searched_bitmap=%s",
|
||||
spider_bit_is_set(spider->searched_bitmap, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider read_set=%s",
|
||||
bitmap_is_set(table->read_set, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider write_set=%s",
|
||||
bitmap_is_set(table->write_set, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
if (
|
||||
spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
|
||||
(
|
||||
spider_bit_is_set(spider->searched_bitmap, field_index) |
|
||||
bitmap_is_set(table->read_set, field_index) |
|
||||
bitmap_is_set(table->write_set, field_index)
|
||||
)
|
||||
) {
|
||||
spider_set_bit(minimum_select_bitmap, field_index);
|
||||
}
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
bool spider_mysql_handler::minimum_select_bit_is_set(
|
||||
uint field_index
|
||||
) {
|
||||
TABLE *table = spider->get_table();
|
||||
DBUG_ENTER("spider_mysql_handler::minimum_select_bit_is_set");
|
||||
DBUG_PRINT("info",("spider this=%p", this));
|
||||
DBUG_PRINT("info",("spider field_index=%u", field_index));
|
||||
DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
|
||||
spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
|
||||
DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
|
||||
spider_bit_is_set(minimum_select_bitmap, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider searched_bitmap=%s",
|
||||
spider_bit_is_set(spider->searched_bitmap, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider read_set=%s",
|
||||
bitmap_is_set(table->read_set, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_PRINT("info",("spider write_set=%s",
|
||||
bitmap_is_set(table->write_set, field_index) ?
|
||||
"TRUE" : "FALSE"));
|
||||
DBUG_RETURN(
|
||||
spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
|
||||
(
|
||||
spider_bit_is_set(spider->searched_bitmap, field_index) |
|
||||
bitmap_is_set(table->read_set, field_index) |
|
||||
bitmap_is_set(table->write_set, field_index)
|
||||
)
|
||||
);
|
||||
DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
|
||||
}
|
||||
|
||||
void spider_mysql_handler::copy_minimum_select_bitmap(
|
||||
@@ -11105,23 +11164,10 @@ void spider_mysql_handler::copy_minimum_select_bitmap(
|
||||
roop_count++)
|
||||
{
|
||||
bitmap[roop_count] =
|
||||
spider->ft_discard_bitmap[roop_count] &
|
||||
(
|
||||
spider->searched_bitmap[roop_count] |
|
||||
((uchar *) table->read_set->bitmap)[roop_count] |
|
||||
((uchar *) table->write_set->bitmap)[roop_count]
|
||||
);
|
||||
minimum_select_bitmap[roop_count];
|
||||
DBUG_PRINT("info",("spider roop_count=%d", roop_count));
|
||||
DBUG_PRINT("info",("spider bitmap=%d",
|
||||
bitmap[roop_count]));
|
||||
DBUG_PRINT("info",("spider ft_discard_bitmap=%d",
|
||||
spider->ft_discard_bitmap[roop_count]));
|
||||
DBUG_PRINT("info",("spider searched_bitmap=%d",
|
||||
spider->searched_bitmap[roop_count]));
|
||||
DBUG_PRINT("info",("spider read_set=%d",
|
||||
((uchar *) table->read_set->bitmap)[roop_count]));
|
||||
DBUG_PRINT("info",("spider write_set=%d",
|
||||
((uchar *) table->write_set->bitmap)[roop_count]));
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
Reference in New Issue
Block a user