Re: [Maria-developers] [Commits] 4861977ce76: MDEV-14695: Assertion `n < m_size' failed in Bounds_checked_array<Element_type>::operator
Hi Varun!
I will take a second look at this but a first minor comment is to not save
two characters by shortening fields to flds, it makes reading unnatural.
Vicentiu
On Sat, 12 May 2018 at 21:45 Varun
revision-id: 4861977ce76761fefb9779a774984b6afa818f2e (mariadb-10.2.5-636-g4861977ce76) parent(s): 8b26fea83572cf5c043721b7835c3828937f9c27 author: Varun Gupta committer: Varun Gupta timestamp: 2018-05-13 00:09:15 +0530 message:
MDEV-14695: Assertion `n < m_size' failed in Bounds_checked_array
::operator In this issue we hit the assert because we are adding addition fields to the field JOIN::all_fields list. This is done because HEAP tables can't index BIT fields so we need to use an additional hidden field for grouping because later it will be converted to a LONG field. Original field will remain of the BIT type and will be returned. This happens when we convert DISTINCT to GROUP BY.
The solution is to take into account the number of such hidden fields that would be added to the field JOIN::all_fields list while calculating the size of the ref_pointer_array.
--- sql/sql_base.cc | 9 ++++++--- sql/sql_base.h | 4 ++-- sql/sql_delete.cc | 3 ++- sql/sql_lex.cc | 8 +++++++- sql/sql_lex.h | 5 +++++ sql/sql_select.cc | 4 +++- sql/sql_union.cc | 1 + 7 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 95ff41cb6f4..81ccfe5e514 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -6919,7 +6919,7 @@ static bool setup_natural_join_row_types(THD *thd,
int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields, List<Item> *sum_func_list, - uint wild_num) + uint wild_num, uint *hidden_bit_flds) { if (!wild_num) return(0); @@ -6960,7 +6960,7 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields, else if (insert_fields(thd, ((Item_field*) item)->context, ((Item_field*) item)->db_name, ((Item_field*) item)->table_name, &it, - any_privileges)) + any_privileges, hidden_bit_flds)) { if (arena) thd->restore_active_arena(arena, &backup); @@ -7425,7 +7425,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table, bool insert_fields(THD *thd, Name_resolution_context *context, const char *db_name, const char *table_name, List_iterator<Item> *it, - bool any_privileges) + bool any_privileges, uint *hidden_bit_flds) { Field_iterator_table_ref field_iterator; bool found; @@ -7545,6 +7545,9 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name, else it->after(item); /* Add 'item' to the SELECT list. */
+ if (item->type() == Item::FIELD_ITEM && item->field_type() == MYSQL_TYPE_BIT) + (*hidden_bit_flds)++; + #ifndef NO_EMBEDDED_ACCESS_CHECKS /* Set privilege information for the fields of newly created views. diff --git a/sql/sql_base.h b/sql/sql_base.h index d6063f1b771..8d0dcb2f197 100644 --- a/sql/sql_base.h +++ b/sql/sql_base.h @@ -154,11 +154,11 @@ bool fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, enum trg_event_type event); bool insert_fields(THD *thd, Name_resolution_context *context, const char *db_name, const char *table_name, - List_iterator<Item> *it, bool any_privileges); + List_iterator<Item> *it, bool any_privileges, uint *hidden_bit_flds); void make_leaves_list(THD *thd, List
&list, TABLE_LIST *tables, bool full_table_list, TABLE_LIST *boundary); int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields, - List<Item> *sum_func_list, uint wild_num); + List<Item> *sum_func_list, uint wild_num, uint * hidden_bit_flds); bool setup_fields(THD *thd, Ref_ptr_array ref_pointer_array, List<Item> &item, enum_mark_columns mark_used_columns, List<Item> *sum_func_list, List<Item> *pre_fix, diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 7b7a7e3f804..7bae7736cf3 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -760,7 +760,8 @@ l select_lex->leaf_tables, FALSE, DELETE_ACL, SELECT_ACL, TRUE)) DBUG_RETURN(TRUE); - if ((wild_num && setup_wild(thd, table_list, field_list, NULL, wild_num)) || + if ((wild_num && setup_wild(thd, table_list, field_list, NULL, wild_num, + &select_lex->hidden_bit_flds)) || setup_fields(thd, Ref_ptr_array(), field_list, MARK_COLUMNS_READ, NULL, NULL, 0) || setup_conds(thd, table_list, select_lex->leaf_tables, conds) || diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 3e36cac96b9..49150c863fe 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2143,6 +2143,7 @@ void st_select_lex::init_query() m_agg_func_used= false; window_specs.empty(); window_funcs.empty(); + hidden_bit_flds= 0; } void st_select_lex::init_select() @@ -2673,6 +2674,10 @@ ulong st_select_lex::get_table_join_options()
bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) { + + if (!((options & SELECT_DISTINCT) && !group_list)) + hidden_bit_flds= 0; + // find_order_in_list() may need some extra space, so multiply by two. order_group_num*= 2;
@@ -2687,7 +2692,8 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) select_n_reserved + select_n_having_items + select_n_where_fields + - order_group_num) * 5; + order_group_num + + hidden_bit_flds) * 5; if (!ref_pointer_array.is_null()) { /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 6d281930d1f..8283496604e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -956,6 +956,11 @@ class st_select_lex: public st_select_lex_node
/* it is for correct printing SELECT options */ thr_lock_type lock_type; + /* + it counts the number of bit fields in the SELECT list. These are used when DISTINCT is + converted to a GROUP BY involving BIT fields. + */ + uint hidden_bit_flds;
void init_query(); void init_select(); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4cd4754596b..83953661ce3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -799,7 +799,9 @@ JOIN::prepare(TABLE_LIST *tables_init, select_lex != select_lex->master_unit()->global_parameters()) real_og_num+= select_lex->order_list.elements;
- if (setup_wild(thd, tables_list, fields_list, &all_fields, wild_num)) + DBUG_ASSERT(select_lex->hidden_bit_flds == 0); + if (setup_wild(thd, tables_list, fields_list, &all_fields, wild_num, + &select_lex->hidden_bit_flds)) DBUG_RETURN(-1); if (select_lex->setup_ref_array(thd, real_og_num)) DBUG_RETURN(-1); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 3fe8a24f8bd..42904e341b6 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1474,6 +1474,7 @@ bool st_select_lex::cleanup() } inner_refs_list.empty(); exclude_from_table_unique_test= FALSE; + hidden_bit_flds= 0; DBUG_RETURN(error); }
_______________________________________________ commits mailing list commits@mariadb.org https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
participants (1)
-
Vicențiu Ciorbaru