Skip to content

Commit 2d1e09a

Browse files
MDEV-26247 Clean up spider_fields
Spider gbh query rewrite should get table for fields in a simple way. Add a method spider_fields::find_table that searches its table holders to find table for a given field. This way we will be able to get rid of the first pass during the gbh creation where field_chains and field_holders are created. We also check that the field belongs to a spider table while walking through the query, so we could remove all_query_fields_are_query_table_members(). However, this requires an earlier creation of the table_holder so that tables are added before checking. We do that, and in doing so, also decouple table_holder and spider_fields Remove unused methods and fields. Add comments.
1 parent 8c1dcb2 commit 2d1e09a

File tree

5 files changed

+114
-338
lines changed

5 files changed

+114
-338
lines changed

storage/spider/spd_db_conn.cc

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9167,19 +9167,20 @@ int spider_db_open_item_ident(
91679167
} else {
91689168
if (str)
91699169
{
9170-
SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
9171-
SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
9172-
spider = field_holder->spider;
9170+
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
9171+
/* If table or table->spider is NULL the GBH creation
9172+
would have been skipped the first pass (see below). */
9173+
spider = table->spider;
91739174
share = spider->share;
91749175
if ((error_num = share->dbton_share[dbton_id]->
91759176
append_column_name_with_alias(str, field->field_index,
9176-
field_holder->alias->ptr(), field_holder->alias->length())))
9177+
table->alias->ptr(), table->alias->length())))
91779178
DBUG_RETURN(error_num);
9178-
} else {
9179-
if ((error_num = fields->add_field(field)))
9180-
{
9181-
DBUG_RETURN(error_num);
9182-
}
9179+
} else
9180+
{
9181+
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
9182+
if (!table || !table->spider)
9183+
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
91839184
}
91849185
}
91859186
}
@@ -9298,21 +9299,20 @@ int spider_db_open_item_field(
92989299
} else {
92999300
if (str)
93009301
{
9301-
SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
9302-
SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
9303-
spider = field_holder->spider;
9302+
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
9303+
/* If table or table->spider is NULL the GBH creation
9304+
would have been skipped the first pass (see below). */
9305+
spider = table->spider;
93049306
share = spider->share;
9305-
field = spider->field_exchange(field);
9306-
DBUG_ASSERT(field);
93079307
if ((error_num = share->dbton_share[dbton_id]->
93089308
append_column_name_with_alias(str, field->field_index,
9309-
field_holder->alias->ptr(), field_holder->alias->length())))
9309+
table->alias->ptr(), table->alias->length())))
93109310
DBUG_RETURN(error_num);
9311-
} else {
9312-
if ((error_num = fields->add_field(field)))
9313-
{
9314-
DBUG_RETURN(error_num);
9315-
}
9311+
} else
9312+
{
9313+
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
9314+
if (!table || !table->spider)
9315+
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
93169316
}
93179317
DBUG_RETURN(0);
93189318
}

storage/spider/spd_db_include.h

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -604,34 +604,26 @@ typedef struct spider_conn_holder
604604
spider_conn_holder *next;
605605
} SPIDER_CONN_HOLDER;
606606

607+
/* Record information of a local (spider) table, for use of the spider
608+
group by handler. */
607609
typedef struct spider_table_holder
608610
{
609611
TABLE *table;
610612
ha_spider *spider;
613+
/* alias of the table, in the form of tk, where k is the index of
614+
the table from `query->from' indexed by next_local. */
611615
spider_string *alias;
612616
} SPIDER_TABLE_HOLDER;
613617

614-
typedef struct spider_field_holder
615-
{
616-
Field *field;
617-
ha_spider *spider;
618-
spider_string *alias;
619-
spider_field_holder *next;
620-
} SPIDER_FIELD_HOLDER;
621-
622-
typedef struct spider_field_chain
623-
{
624-
spider_field_holder *field_holder;
625-
spider_field_chain *next;
626-
} SPIDER_FIELD_CHAIN;
627-
618+
/* For use of the spider group by handler. */
628619
class spider_fields
629620
{
630621
uint dbton_count;
631622
uint current_dbton_num;
632623
uint dbton_ids[SPIDER_DBTON_SIZE];
624+
/* Number of tables in `query->from'. */
633625
uint table_count;
634-
uint current_table_num;
626+
/* All tables in `query->from', in the same order by next_local. */
635627
SPIDER_TABLE_HOLDER *table_holder;
636628
SPIDER_LINK_IDX_CHAIN *first_link_idx_chain;
637629
SPIDER_LINK_IDX_CHAIN *last_link_idx_chain;
@@ -640,13 +632,6 @@ class spider_fields
640632
SPIDER_CONN_HOLDER *first_conn_holder;
641633
SPIDER_CONN_HOLDER *last_conn_holder;
642634
SPIDER_CONN_HOLDER *current_conn_holder;
643-
SPIDER_FIELD_HOLDER *first_field_holder;
644-
SPIDER_FIELD_HOLDER *last_field_holder;
645-
SPIDER_FIELD_HOLDER *current_field_holder;
646-
SPIDER_FIELD_CHAIN *first_field_chain;
647-
SPIDER_FIELD_CHAIN *last_field_chain;
648-
SPIDER_FIELD_CHAIN *current_field_chain;
649-
Field **first_field_ptr;
650635
Field **current_field_ptr;
651636
public:
652637
spider_fields();
@@ -702,24 +687,14 @@ class spider_fields
702687
void free_conn_holder(
703688
SPIDER_CONN_HOLDER *conn_holder_arg
704689
);
705-
SPIDER_TABLE_HOLDER *add_table(
706-
ha_spider *spider_arg
707-
);
708-
bool all_query_fields_are_query_table_members();
709-
int create_table_holder(
690+
SPIDER_TABLE_HOLDER *find_table(Field *field);
691+
void set_table_holder(
692+
SPIDER_TABLE_HOLDER *table_holder_arg,
710693
uint table_count_arg
711694
);
712-
void set_pos_to_first_table_holder();
713-
SPIDER_TABLE_HOLDER *get_next_table_holder();
695+
SPIDER_TABLE_HOLDER *get_first_table_holder();
714696
SPIDER_TABLE_HOLDER *get_table_holder(TABLE *table);
715697
uint get_table_count();
716-
int add_field(Field *field_arg);
717-
SPIDER_FIELD_HOLDER *create_field_holder();
718-
void set_pos_to_first_field_holder();
719-
SPIDER_FIELD_HOLDER *get_next_field_holder();
720-
SPIDER_FIELD_CHAIN *create_field_chain();
721-
void set_pos_to_first_field_chain();
722-
SPIDER_FIELD_CHAIN *get_next_field_chain();
723698
void set_field_ptr(Field **field_arg);
724699
Field **get_next_field_ptr();
725700
int ping_table_mon_from_table(

storage/spider/spd_db_mysql.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15639,8 +15639,7 @@ int spider_mbase_handler::append_from_and_tables_part(
1563915639
default:
1564015640
DBUG_RETURN(0);
1564115641
}
15642-
fields->set_pos_to_first_table_holder();
15643-
table_holder = fields->get_next_table_holder();
15642+
table_holder = fields->get_first_table_holder();
1564415643
table_list = table_holder->table->pos_in_table_list;
1564515644
error_num = spider_db_mbase_utility->append_from_and_tables(
1564615645
table_holder->spider, fields, str,

storage/spider/spd_db_mysql.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,11 @@ class spider_mbase_share: public spider_db_share
676676
spider_string *show_table_status;
677677
spider_string *show_records;
678678
spider_string *show_index;
679+
/* The remote table names */
679680
spider_string *table_names_str;
681+
/* The remote db names */
680682
spider_string *db_names_str;
683+
/* fixme: this field looks useless */
681684
spider_string *db_table_str;
682685
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
683686
my_hash_value_type *db_table_str_hash_value;

0 commit comments

Comments
 (0)