Loading sql/sql_select.cc +168 −131 Original line number Diff line number Diff line Loading @@ -144,7 +144,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab); static void init_sum_functions(Item_sum **func); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct); bool distinct, const char *message=NullS); static void describe_info(THD *thd, const char *info); /* Loading Loading @@ -195,6 +195,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, Procedure *procedure; List<Item> all_fields(fields); bool select_distinct; SELECT_LEX *select_lex = &(thd->lex.select_lex); DBUG_ENTER("mysql_select"); /* Check that all tables, fields, conds and order are ok */ Loading Loading @@ -350,6 +351,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (cond_value == Item::COND_FALSE || !thd->select_limit) { /* Impossible cond */ if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE"); else error=return_zero_rows(result, tables, fields, join.tmp_table_param.sum_func_count != 0 && !group, select_options,"Impossible WHERE",having, Loading @@ -366,6 +370,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, { if (res < 0) { if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"No matching min/max row"); else error=return_zero_rows(result, tables, fields, !group, select_options,"No matching min/max row", having,procedure); Loading @@ -374,9 +381,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (select_options & SELECT_DESCRIBE) { if (select_lex->next) select_describe(&join,false,false,false,"Select tables optimized away"); else describe_info(thd,"Select tables optimized away"); delete procedure; DBUG_RETURN(0); DBUG_RETURN(error); } tables=0; // All tables resolved } Loading @@ -385,7 +395,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, { // Only test of functions error=0; if (select_options & SELECT_DESCRIBE) { if (select_lex->next) select_describe(&join,false,false,false,"No tables used"); else describe_info(thd,"No tables used"); } else { result->send_fields(fields,1); Loading Loading @@ -463,6 +478,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (make_join_select(&join,select,conds)) { if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); else error=return_zero_rows(result,tables,fields, join.tmp_table_param.sum_func_count != 0 && !group, select_options, Loading Loading @@ -535,7 +553,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, make_join_readinfo(&join, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | (thd->lex.select_lex.ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); (select_lex->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all columns of the tables: this is because MySQL Loading Loading @@ -2516,6 +2534,7 @@ static void make_join_readinfo(JOIN *join,uint options) { uint i; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("make_join_readinfo"); for (i=join->const_tables ; i < join->tables ; i++) Loading Loading @@ -2598,7 +2617,7 @@ make_join_readinfo(JOIN *join,uint options) /* These init changes read_record */ if (tab->use_quick == 2) { join->thd->lex.select_lex.options|=QUERY_NO_GOOD_INDEX_USED; select_lex->options|=QUERY_NO_GOOD_INDEX_USED; tab->read_first_record= join_init_quick_read_record; statistic_increment(select_range_check_count, &LOCK_status); } Loading @@ -2613,7 +2632,7 @@ make_join_readinfo(JOIN *join,uint options) } else { join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_scan_count, &LOCK_status); } } Loading @@ -2625,7 +2644,7 @@ make_join_readinfo(JOIN *join,uint options) } else { join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_full_join_count, &LOCK_status); } } Loading Loading @@ -6940,16 +6959,17 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab) ****************************************************************************/ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct) bool distinct,const char *message) { List<Item> field_list; Item *item; THD *thd=join->thd; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("select_describe"); /* Don't log this into the slow query log */ join->thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); if (join->thd->lex.select == &join->thd->lex.select_lex) select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); if (join->thd->lex.select == select_lex) { field_list.push_back(new Item_empty_string("table",NAME_LEN)); field_list.push_back(new Item_empty_string("type",10)); Loading @@ -6970,6 +6990,22 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } char buff[512],*buff_ptr; String tmp(buff,sizeof(buff)),*packet= &thd->packet; if (message) { packet->length(0); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_data(packet,message,strlen(message)); if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_VOID_RETURN; } else { table_map used_tables=0; for (uint i=0 ; i < join->tables ; i++) { Loading Loading @@ -7093,11 +7129,12 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } net_store_data(packet,buff,(uint) (buff_ptr - buff)); if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_VOID_RETURN; /* purecov: inspected */ DBUG_VOID_RETURN; /* Purecov: Inspected */ // For next iteration used_tables|=table->map; } } if (!join->thd->lex.select->next) send_eof(&thd->net); DBUG_VOID_RETURN; Loading sql/sql_union.cc +6 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) for (sl= &lex->select_lex; sl; sl=sl->next) { lex->select=sl; thd->offset_limit=sl->offset_limit; thd->select_limit=sl->select_limit+sl->offset_limit; if (thd->select_limit < sl->select_limit) thd->select_limit= HA_POS_ERROR; // no limit if (thd->select_limit == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, sl->item_list, sl->where, Loading Loading
sql/sql_select.cc +168 −131 Original line number Diff line number Diff line Loading @@ -144,7 +144,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab); static void init_sum_functions(Item_sum **func); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct); bool distinct, const char *message=NullS); static void describe_info(THD *thd, const char *info); /* Loading Loading @@ -195,6 +195,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, Procedure *procedure; List<Item> all_fields(fields); bool select_distinct; SELECT_LEX *select_lex = &(thd->lex.select_lex); DBUG_ENTER("mysql_select"); /* Check that all tables, fields, conds and order are ok */ Loading Loading @@ -350,6 +351,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (cond_value == Item::COND_FALSE || !thd->select_limit) { /* Impossible cond */ if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE"); else error=return_zero_rows(result, tables, fields, join.tmp_table_param.sum_func_count != 0 && !group, select_options,"Impossible WHERE",having, Loading @@ -366,6 +370,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, { if (res < 0) { if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"No matching min/max row"); else error=return_zero_rows(result, tables, fields, !group, select_options,"No matching min/max row", having,procedure); Loading @@ -374,9 +381,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (select_options & SELECT_DESCRIBE) { if (select_lex->next) select_describe(&join,false,false,false,"Select tables optimized away"); else describe_info(thd,"Select tables optimized away"); delete procedure; DBUG_RETURN(0); DBUG_RETURN(error); } tables=0; // All tables resolved } Loading @@ -385,7 +395,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, { // Only test of functions error=0; if (select_options & SELECT_DESCRIBE) { if (select_lex->next) select_describe(&join,false,false,false,"No tables used"); else describe_info(thd,"No tables used"); } else { result->send_fields(fields,1); Loading Loading @@ -463,6 +478,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, } if (make_join_select(&join,select,conds)) { if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); else error=return_zero_rows(result,tables,fields, join.tmp_table_param.sum_func_count != 0 && !group, select_options, Loading Loading @@ -535,7 +553,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, make_join_readinfo(&join, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | (thd->lex.select_lex.ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); (select_lex->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all columns of the tables: this is because MySQL Loading Loading @@ -2516,6 +2534,7 @@ static void make_join_readinfo(JOIN *join,uint options) { uint i; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("make_join_readinfo"); for (i=join->const_tables ; i < join->tables ; i++) Loading Loading @@ -2598,7 +2617,7 @@ make_join_readinfo(JOIN *join,uint options) /* These init changes read_record */ if (tab->use_quick == 2) { join->thd->lex.select_lex.options|=QUERY_NO_GOOD_INDEX_USED; select_lex->options|=QUERY_NO_GOOD_INDEX_USED; tab->read_first_record= join_init_quick_read_record; statistic_increment(select_range_check_count, &LOCK_status); } Loading @@ -2613,7 +2632,7 @@ make_join_readinfo(JOIN *join,uint options) } else { join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_scan_count, &LOCK_status); } } Loading @@ -2625,7 +2644,7 @@ make_join_readinfo(JOIN *join,uint options) } else { join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_full_join_count, &LOCK_status); } } Loading Loading @@ -6940,16 +6959,17 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab) ****************************************************************************/ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct) bool distinct,const char *message) { List<Item> field_list; Item *item; THD *thd=join->thd; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("select_describe"); /* Don't log this into the slow query log */ join->thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); if (join->thd->lex.select == &join->thd->lex.select_lex) select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); if (join->thd->lex.select == select_lex) { field_list.push_back(new Item_empty_string("table",NAME_LEN)); field_list.push_back(new Item_empty_string("type",10)); Loading @@ -6970,6 +6990,22 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } char buff[512],*buff_ptr; String tmp(buff,sizeof(buff)),*packet= &thd->packet; if (message) { packet->length(0); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_null(packet); net_store_data(packet,message,strlen(message)); if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_VOID_RETURN; } else { table_map used_tables=0; for (uint i=0 ; i < join->tables ; i++) { Loading Loading @@ -7093,11 +7129,12 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } net_store_data(packet,buff,(uint) (buff_ptr - buff)); if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_VOID_RETURN; /* purecov: inspected */ DBUG_VOID_RETURN; /* Purecov: Inspected */ // For next iteration used_tables|=table->map; } } if (!join->thd->lex.select->next) send_eof(&thd->net); DBUG_VOID_RETURN; Loading
sql/sql_union.cc +6 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) for (sl= &lex->select_lex; sl; sl=sl->next) { lex->select=sl; thd->offset_limit=sl->offset_limit; thd->select_limit=sl->select_limit+sl->offset_limit; if (thd->select_limit < sl->select_limit) thd->select_limit= HA_POS_ERROR; // no limit if (thd->select_limit == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, sl->item_list, sl->where, Loading