summaryrefslogtreecommitdiffstats
path: root/storage/spider/spd_group_by_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/spider/spd_group_by_handler.cc')
-rw-r--r--storage/spider/spd_group_by_handler.cc595
1 files changed, 179 insertions, 416 deletions
diff --git a/storage/spider/spd_group_by_handler.cc b/storage/spider/spd_group_by_handler.cc
index 3cd299c6..6236a7b9 100644
--- a/storage/spider/spd_group_by_handler.cc
+++ b/storage/spider/spd_group_by_handler.cc
@@ -22,6 +22,7 @@
#include "probes_mysql.h"
#include "sql_class.h"
#include "sql_partition.h"
+#include "sql_select.h"
#include "ha_partition.h"
#include "sql_common.h"
#include <errmsg.h>
@@ -42,11 +43,9 @@ extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
spider_fields::spider_fields() :
dbton_count(0), current_dbton_num(0),
- table_count(0), current_table_num(0), table_holder(NULL),
+ table_count(0), table_holder(NULL),
first_link_idx_chain(NULL), last_link_idx_chain(NULL), current_link_idx_chain(NULL),
- first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL),
- first_field_holder(NULL), last_field_holder(NULL), current_field_holder(NULL),
- first_field_chain(NULL), last_field_chain(NULL), current_field_chain(NULL)
+ first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL)
{
DBUG_ENTER("spider_fields::spider_fields");
DBUG_PRINT("info",("spider this=%p", this));
@@ -65,24 +64,6 @@ spider_fields::~spider_fields()
spider_free(spider_current_trx, current_link_idx_chain, MYF(0));
}
}
- if (first_field_chain)
- {
- while ((current_field_chain = first_field_chain))
- {
- first_field_chain = current_field_chain->next;
- spider_free(spider_current_trx, current_field_chain, MYF(0));
- }
- }
- if (first_field_holder)
- {
- while ((current_field_holder = first_field_holder))
- {
- first_field_holder = current_field_holder->next;
- spider_free(spider_current_trx, current_field_holder, MYF(0));
- }
- }
- if (table_holder)
- spider_free(spider_current_trx, table_holder, MYF(0));
if (first_conn_holder)
{
while ((current_conn_holder = first_conn_holder))
@@ -364,7 +345,7 @@ SPIDER_LINK_IDX_CHAIN *spider_fields::create_link_idx_chain(
DBUG_ENTER("spider_fields::create_link_idx_chain");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((SPIDER_LINK_IDX_CHAIN *)
- spider_malloc(spider_current_trx, 254, sizeof(SPIDER_LINK_IDX_CHAIN),
+ spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_CHAIN_1, sizeof(SPIDER_LINK_IDX_CHAIN),
MYF(MY_WME | MY_ZEROFILL)));
}
@@ -471,7 +452,6 @@ int spider_fields::get_ok_link_idx(
void spider_fields::set_first_link_idx(
) {
- SPIDER_TABLE_HOLDER *table_holder;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
SPIDER_LINK_IDX_CHAIN *link_idx_chain;
uint dbton_id;
@@ -493,11 +473,10 @@ void spider_fields::set_first_link_idx(
DBUG_ASSERT(link_idx_chain);
set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
- set_pos_to_first_table_holder();
- while ((table_holder = get_next_table_holder()))
+ for (uint i= 0; i < table_count; i++)
{
link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
- spider = table_holder->spider;
+ spider = table_holder[i].spider;
dbton_hdl = spider->dbton_handler[dbton_id];
dbton_hdl->first_link_idx = link_idx_holder->link_idx;
}
@@ -554,7 +533,7 @@ SPIDER_LINK_IDX_HOLDER *spider_fields::create_link_idx_holder(
DBUG_ENTER("spider_fields::create_link_idx_holder");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((SPIDER_LINK_IDX_HOLDER *)
- spider_malloc(spider_current_trx, 253, sizeof(SPIDER_LINK_IDX_HOLDER),
+ spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_HOLDER_1, sizeof(SPIDER_LINK_IDX_HOLDER),
MYF(MY_WME | MY_ZEROFILL)));
}
@@ -632,7 +611,7 @@ SPIDER_CONN_HOLDER *spider_fields::create_conn_holder(
DBUG_ENTER("spider_fields::create_conn_holder");
DBUG_PRINT("info",("spider this=%p", this));
return_conn_holder = (SPIDER_CONN_HOLDER *)
- spider_bulk_malloc(spider_current_trx, 252, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_CONN_HOLDER_1, MYF(MY_WME | MY_ZEROFILL),
&return_conn_holder, (uint) (sizeof(SPIDER_CONN_HOLDER)),
&table_link_idx_holder,
(uint) (table_count * sizeof(SPIDER_TABLE_LINK_IDX_HOLDER)),
@@ -646,24 +625,6 @@ SPIDER_CONN_HOLDER *spider_fields::create_conn_holder(
DBUG_RETURN(return_conn_holder);
}
-void spider_fields::set_pos_to_first_conn_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_conn_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_conn_holder = first_conn_holder;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_CONN_HOLDER *spider_fields::get_next_conn_holder(
-) {
- SPIDER_CONN_HOLDER *return_conn_holder = current_conn_holder;
- DBUG_ENTER("spider_fields::get_next_conn_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_conn_holder)
- current_conn_holder = current_conn_holder->next;
- DBUG_RETURN(return_conn_holder);
-}
-
bool spider_fields::has_conn_holder(
) {
DBUG_ENTER("spider_fields::has_conn_holder");
@@ -862,19 +823,17 @@ void spider_fields::free_conn_holder(
DBUG_VOID_RETURN;
}
-SPIDER_TABLE_HOLDER *spider_fields::add_table(
- ha_spider *spider_arg
+/* Add the table associated with an ha_spider to a table_holder.
+Return the table_holder. */
+static SPIDER_TABLE_HOLDER *spider_add_table_holder(
+ ha_spider *spider_arg,
+ SPIDER_TABLE_HOLDER *table_holder
) {
spider_string *str;
uint length;
char tmp_buf[SPIDER_SQL_INT_LEN + 2];
SPIDER_TABLE_HOLDER *return_table_holder;
- SPIDER_FIELD_HOLDER *field_holder;
- TABLE *table = spider_arg->get_table();
- Field *field;
DBUG_ENTER("spider_fields::add_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider table_count=%u", table_count));
DBUG_PRINT("info",("spider idx_for_direct_join=%u",
spider_arg->idx_for_direct_join));
length = my_sprintf(tmp_buf, (tmp_buf, "t%u",
@@ -893,90 +852,49 @@ SPIDER_TABLE_HOLDER *spider_fields::add_table(
return_table_holder->spider = spider_arg;
return_table_holder->alias = str;
- set_pos_to_first_field_holder();
- while ((field_holder = get_next_field_holder()))
- {
- if (!field_holder->spider)
- {
- field = field_holder->field;
- if (
- field->field_index < table->s->fields &&
- field == table->field[field->field_index]
- ) {
- field_holder->spider = spider_arg;
- field_holder->alias = str;
- }
- }
- }
DBUG_RETURN(return_table_holder);
}
-/**
- Verify that all fields in the query are members of tables that are in the
- query.
-
- @return TRUE All fields in the query are members of tables
- that are in the query.
- FALSE At least one field in the query is not a
- member of a table that is in the query.
-*/
-
-bool spider_fields::all_query_fields_are_query_table_members()
+/* Return the table that field belongs to, or NULL if none exists. */
+SPIDER_TABLE_HOLDER *spider_fields::find_table(Field *field)
{
- SPIDER_FIELD_HOLDER *field_holder;
- DBUG_ENTER("spider_fields::all_query_fields_are_query_table_members");
- DBUG_PRINT("info",("spider this=%p", this));
-
- set_pos_to_first_field_holder();
- while ((field_holder = get_next_field_holder()))
- {
- if (!field_holder->spider)
- {
- DBUG_PRINT("info", ("spider field is not a member of a query table"));
- DBUG_RETURN(FALSE);
- }
- }
+ for (uint i = 0; i < table_count; i++)
+ if (field->table == table_holder[i].table)
+ return &table_holder[i];
+ return NULL;
+}
- DBUG_RETURN(TRUE);
+void spider_fields::set_table_holder(SPIDER_TABLE_HOLDER *table_holder_arg,
+ uint table_count_arg)
+{
+ table_holder= table_holder_arg;
+ table_count= table_count_arg;
}
-int spider_fields::create_table_holder(
+/* Allocate space for table_count_arg table holders. */
+static SPIDER_TABLE_HOLDER *spider_create_table_holder(
uint table_count_arg
) {
- DBUG_ENTER("spider_fields::create_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(!table_holder);
+ SPIDER_TABLE_HOLDER* table_holder;
+ DBUG_ENTER("spider_create_table_holder");
+ if (table_count_arg == 0)
+ DBUG_RETURN(0);
table_holder = (SPIDER_TABLE_HOLDER *)
- spider_malloc(spider_current_trx, 249,
+ spider_malloc(spider_current_trx, SPD_MID_CREATE_TABLE_HOLDER_1,
table_count_arg * sizeof(SPIDER_TABLE_HOLDER),
MYF(MY_WME | MY_ZEROFILL));
- if (!table_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- table_count = table_count_arg;
- current_table_num = 0;
- DBUG_RETURN(0);
+ DBUG_RETURN(table_holder);
}
-void spider_fields::set_pos_to_first_table_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_table_num = 0;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_TABLE_HOLDER *spider_fields::get_next_table_holder(
-) {
- SPIDER_TABLE_HOLDER *return_table_holder;
- DBUG_ENTER("spider_fields::get_next_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_table_num >= table_count)
- DBUG_RETURN(NULL);
- return_table_holder = &table_holder[current_table_num];
- ++current_table_num;
- DBUG_RETURN(return_table_holder);
+/* Return pointer to the first table holder. */
+SPIDER_TABLE_HOLDER *spider_fields::get_first_table_holder()
+{
+ DBUG_ENTER("spider_fields::get_first_spider");
+ DBUG_RETURN(table_holder);
}
+/* Return the first table holder associated with a given table, or
+NULL if not found. */
SPIDER_TABLE_HOLDER *spider_fields::get_table_holder(TABLE *table)
{
uint table_num;
@@ -996,117 +914,12 @@ uint spider_fields::get_table_count()
DBUG_RETURN(table_count);
}
-int spider_fields::add_field(
- Field *field_arg
-) {
- SPIDER_FIELD_HOLDER *field_holder;
- SPIDER_FIELD_CHAIN *field_chain;
- DBUG_ENTER("spider_fields::add_field");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider field=%p", field_arg));
- if (!first_field_holder)
- {
- field_holder = create_field_holder();
- DBUG_PRINT("info",("spider field_holder=%p", field_holder));
- if (!field_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_holder->field = field_arg;
- first_field_holder = field_holder;
- last_field_holder = field_holder;
- } else {
- field_holder = first_field_holder;
- do {
- if (field_holder->field == field_arg)
- break;
- } while ((field_holder = field_holder->next));
- if (!field_holder)
- {
- field_holder = create_field_holder();
- DBUG_PRINT("info",("spider field_holder=%p", field_holder));
- if (!field_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_holder->field = field_arg;
- last_field_holder->next = field_holder;
- last_field_holder = field_holder;
- }
- }
- field_chain = create_field_chain();
- DBUG_PRINT("info",("spider field_chain=%p", field_chain));
- if (!field_chain)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_chain->field_holder = field_holder;
- if (!first_field_chain)
- {
- first_field_chain = field_chain;
- last_field_chain = field_chain;
- } else {
- last_field_chain->next = field_chain;
- last_field_chain = field_chain;
- }
- DBUG_RETURN(0);
-}
-
-SPIDER_FIELD_HOLDER *spider_fields::create_field_holder(
-) {
- DBUG_ENTER("spider_fields::create_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_FIELD_HOLDER *)
- spider_malloc(spider_current_trx, 250, sizeof(SPIDER_FIELD_HOLDER),
- MYF(MY_WME | MY_ZEROFILL)));
-}
-
-void spider_fields::set_pos_to_first_field_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_field_holder = first_field_holder;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_FIELD_HOLDER *spider_fields::get_next_field_holder(
-) {
- SPIDER_FIELD_HOLDER *return_field_holder = current_field_holder;
- DBUG_ENTER("spider_fields::get_next_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_field_holder)
- current_field_holder = current_field_holder->next;
- DBUG_RETURN(return_field_holder);
-}
-
-SPIDER_FIELD_CHAIN *spider_fields::create_field_chain(
-) {
- DBUG_ENTER("spider_fields::create_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_FIELD_CHAIN *)
- spider_malloc(spider_current_trx, 251, sizeof(SPIDER_FIELD_CHAIN),
- MYF(MY_WME | MY_ZEROFILL)));
-}
-
-void spider_fields::set_pos_to_first_field_chain(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- current_field_chain = first_field_chain;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_FIELD_CHAIN *spider_fields::get_next_field_chain(
-) {
- SPIDER_FIELD_CHAIN *return_field_chain = current_field_chain;
- DBUG_ENTER("spider_fields::get_next_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_field_chain)
- current_field_chain = current_field_chain->next;
- DBUG_RETURN(return_field_chain);
-}
-
void spider_fields::set_field_ptr(
Field **field_arg
) {
DBUG_ENTER("spider_fields::set_field_ptr");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider field_ptr=%p", field_arg));
- first_field_ptr = field_arg;
current_field_ptr = field_arg;
DBUG_VOID_RETURN;
}
@@ -1129,15 +942,13 @@ int spider_fields::ping_table_mon_from_table(
ha_spider *tmp_spider;
SPIDER_SHARE *tmp_share;
int tmp_link_idx;
- SPIDER_TABLE_HOLDER *table_holder;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
DBUG_ENTER("spider_fields::ping_table_mon_from_table");
set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
- set_pos_to_first_table_holder();
- while ((table_holder = get_next_table_holder()))
+ for (uint i= 0; i < table_count; i++)
{
link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
- tmp_spider = table_holder->spider;
+ tmp_spider = table_holder[i].spider;
tmp_link_idx = link_idx_holder->link_idx;
tmp_share = tmp_spider->share;
if (tmp_share->monitoring_kind[tmp_link_idx])
@@ -1173,9 +984,7 @@ spider_group_by_handler::spider_group_by_handler(
query(*query_arg), fields(fields_arg)
{
DBUG_ENTER("spider_group_by_handler::spider_group_by_handler");
- fields->set_pos_to_first_table_holder();
- SPIDER_TABLE_HOLDER *table_holder = fields->get_next_table_holder();
- spider = table_holder->spider;
+ spider = fields->get_first_table_holder()->spider;
trx = spider->wide_handler->trx;
DBUG_VOID_RETURN;
}
@@ -1183,42 +992,20 @@ spider_group_by_handler::spider_group_by_handler(
spider_group_by_handler::~spider_group_by_handler()
{
DBUG_ENTER("spider_group_by_handler::~spider_group_by_handler");
+ spider_free(spider_current_trx, fields->get_first_table_holder(), MYF(0));
delete fields;
DBUG_VOID_RETURN;
}
-int spider_group_by_handler::init_scan()
+static int spider_prepare_init_scan(
+ const Query& query, spider_fields *fields, ha_spider *spider,
+ SPIDER_TRX *trx, longlong& offset_limit, THD *thd)
{
- int error_num, link_idx;
- uint dbton_id;
- spider_db_handler *dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
st_select_lex *select_lex;
- longlong select_limit;
- longlong direct_order_limit;
+ longlong select_limit, direct_order_limit;
SPIDER_SHARE *share = spider->share;
- SPIDER_CONN *conn;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_LINK_IDX_CHAIN *link_idx_chain;
- SPIDER_LINK_IDX_HOLDER *link_idx_holder;
- DBUG_ENTER("spider_group_by_handler::init_scan");
- store_error = 0;
-#ifndef DBUG_OFF
- Field **field;
- for (
- field = table->field;
- *field;
- field++
- ) {
- DBUG_PRINT("info",("spider field_name=%s",
- SPIDER_field_name_str(*field)));
- }
-#endif
-
- if (trx->thd->killed)
- {
- my_error(ER_QUERY_INTERRUPTED, MYF(0));
- DBUG_RETURN(ER_QUERY_INTERRUPTED);
- }
+ DBUG_ENTER("spider_prepare_init_scan");
spider->use_fields = TRUE;
spider->fields = fields;
@@ -1264,7 +1051,7 @@ int spider_group_by_handler::init_scan()
}
result_list->semi_split_read_base = 0;
result_list->set_split_read = TRUE;
- if ((error_num = spider_set_conn_bg_param(spider)))
+ if (int error_num = spider_set_conn_bg_param(spider))
DBUG_RETURN(error_num);
DBUG_PRINT("info",("spider result_list.finish_flg = FALSE"));
result_list->finish_flg = FALSE;
@@ -1284,86 +1071,87 @@ int spider_group_by_handler::init_scan()
} else {
offset_limit = 0;
}
+ DBUG_RETURN(0);
+}
+
+static int spider_make_query(const Query& query, spider_fields* fields, ha_spider *spider, TABLE *table)
+{
+ uint dbton_id;
+ spider_db_handler* dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ int error_num;
+ DBUG_ENTER("spider_make_query");
- /* making a query */
fields->set_pos_to_first_dbton_id();
while ((dbton_id = fields->get_next_dbton_id()) < SPIDER_DBTON_SIZE)
{
dbton_hdl = spider->dbton_handler[dbton_id];
result_list->direct_distinct = query.distinct;
- fields->set_pos_to_first_field_chain();
if ((error_num = dbton_hdl->reset_sql(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_select_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
DBUG_RETURN(error_num);
- }
fields->set_field_ptr(table->field);
if ((error_num = dbton_hdl->append_list_item_select_part(
- query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_from_and_tables_part(
- fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if (query.where)
{
if ((error_num =
- dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_item_type_part(
- query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.group_by)
{
if ((error_num = dbton_hdl->append_group_by_part(
- query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.having)
{
if ((error_num =
- dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_item_type_part(
- query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.order_by)
{
if ((error_num = dbton_hdl->append_order_by_part(
- query.order_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.order_by, NULL, 0, TRUE, fields,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
- if ((error_num = dbton_hdl->append_limit_part(result_list->internal_offset,
- result_list->limit_num, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ if ((error_num = dbton_hdl->append_limit_part(
+ result_list->internal_offset, result_list->limit_num,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_select_lock_part(
- SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
+ DBUG_RETURN(0);
+}
+
+static int spider_send_query(
+ spider_fields *fields, ha_spider *spider, SPIDER_TRX *trx, TABLE *table,
+ int& store_error)
+{
+ int error_num, link_idx;
+ spider_db_handler *dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_CONN *conn;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_send_query");
fields->set_pos_to_first_link_idx_chain();
while ((link_idx_chain = fields->get_next_link_idx_chain()))
@@ -1382,12 +1170,8 @@ int spider_group_by_handler::init_scan()
dbton_hdl->first_link_idx, TRUE, FALSE,
!fields->is_first_link_ok_chain(link_idx_chain))))
{
- if (
- error_num != HA_ERR_END_OF_FILE &&
- spider->need_mons[link_idx]
- ) {
+ if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
@@ -1395,14 +1179,12 @@ int spider_group_by_handler::init_scan()
}
DBUG_RETURN(error_num);
}
- } else {
+ } else
+ {
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
- if ((error_num =
- dbton_hdl->set_sql_for_exec(SPIDER_SQL_TYPE_SELECT_SQL, link_idx,
- link_idx_chain)))
- {
+ if ((error_num = dbton_hdl->set_sql_for_exec(
+ SPIDER_SQL_TYPE_SELECT_SQL, link_idx, link_idx_chain)))
DBUG_RETURN(error_num);
- }
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[link_idx];
@@ -1412,6 +1194,7 @@ int spider_group_by_handler::init_scan()
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn,
link_idx)))
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
@@ -1419,37 +1202,32 @@ int spider_group_by_handler::init_scan()
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (
- spider->need_mons[link_idx]
- ) {
+ if (spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
}
DBUG_RETURN(error_num);
}
- spider_conn_set_timeout_from_share(conn, link_idx,
- trx->thd, share);
+ spider_conn_set_timeout_from_share(conn, link_idx, trx->thd, share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_SELECT_SQL,
conn,
spider->result_list.quick_mode,
- &spider->need_mons[link_idx])
- ) {
+ &spider->need_mons[link_idx]))
+ {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
- if (
- spider->need_mons[link_idx]
- ) {
+ if (spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
@@ -1465,13 +1243,10 @@ int spider_group_by_handler::init_scan()
{
if ((error_num = spider_db_store_result(spider, link_idx, table)))
{
- if (
- error_num != HA_ERR_END_OF_FILE &&
- spider->need_mons[link_idx]
- ) {
+ if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
@@ -1480,13 +1255,45 @@ int spider_group_by_handler::init_scan()
}
spider->result_link_idx = link_idx;
spider->result_link_idx_chain = link_idx_chain;
- } else {
+ } else
+ {
spider_db_discard_result(spider, link_idx, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
}
+ DBUG_RETURN(0);
+}
+
+/*
+ Prepare and send query to data nodes and store the query results.
+*/
+int spider_group_by_handler::init_scan()
+{
+ int error_num;
+ DBUG_ENTER("spider_group_by_handler::init_scan");
+ store_error = 0;
+#ifndef DBUG_OFF
+ for (Field **field = table->field; *field; field++)
+ DBUG_PRINT("info",("spider field_name=%s", SPIDER_field_name_str(*field)));
+#endif
+
+ if (trx->thd->killed)
+ {
+ my_error(ER_QUERY_INTERRUPTED, MYF(0));
+ DBUG_RETURN(ER_QUERY_INTERRUPTED);
+ }
+
+ if ((error_num = spider_prepare_init_scan(
+ query, fields, spider, trx, offset_limit, thd)))
+ DBUG_RETURN(error_num);
+
+ if ((error_num = spider_make_query(query, fields, spider, table)))
+ DBUG_RETURN(error_num);
+
+ if ((error_num = spider_send_query(fields, spider, trx, table, store_error)))
+ DBUG_RETURN(error_num);
first = TRUE;
DBUG_RETURN(0);
@@ -1595,7 +1402,8 @@ group_by_handler *spider_create_group_by_handler(
bool keep_going;
bool find_dbton = FALSE;
spider_fields *fields = NULL, *fields_arg = NULL;
- uint table_idx, dbton_id;
+ SPIDER_TABLE_HOLDER *table_holder;
+ uint table_idx, dbton_id, table_count= 0;
long tgt_link_status;
DBUG_ENTER("spider_create_group_by_handler");
@@ -1617,8 +1425,7 @@ group_by_handler *spider_create_group_by_handler(
from = query->from;
do {
DBUG_PRINT("info",("spider from=%p", from));
- if (from->table->const_table)
- continue;
+ ++table_count;
if (from->table->part_info)
{
DBUG_PRINT("info",("spider partition handler"));
@@ -1633,17 +1440,11 @@ group_by_handler *spider_create_group_by_handler(
}
} while ((from = from->next_local));
+ if (!(table_holder= spider_create_table_holder(table_count)))
+ DBUG_RETURN(NULL);
+
table_idx = 0;
from = query->from;
- while (from && from->table->const_table)
- {
- from = from->next_local;
- }
- if (!from)
- {
- /* all tables are const_table */
- DBUG_RETURN(NULL);
- }
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1657,6 +1458,11 @@ group_by_handler *spider_create_group_by_handler(
share = spider->share;
spider->idx_for_direct_join = table_idx;
++table_idx;
+ if (!spider_add_table_holder(spider, table_holder))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ goto skip_free_table_holder;
+ }
memset(dbton_bitmap, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
{
@@ -1670,8 +1476,6 @@ group_by_handler *spider_create_group_by_handler(
}
while ((from = from->next_local))
{
- if (from->table->const_table)
- continue;
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1685,6 +1489,11 @@ group_by_handler *spider_create_group_by_handler(
share = spider->share;
spider->idx_for_direct_join = table_idx;
++table_idx;
+ if (!spider_add_table_holder(spider, table_holder))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ goto skip_free_table_holder;
+ }
memset(dbton_bitmap_tmp, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
{
@@ -1705,8 +1514,6 @@ group_by_handler *spider_create_group_by_handler(
from = query->from;
do {
- if (from->table->const_table)
- continue;
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1734,10 +1541,9 @@ group_by_handler *spider_create_group_by_handler(
{
fields_arg = new spider_fields();
if (!fields_arg)
- {
- DBUG_RETURN(NULL);
- }
+ goto skip_free_table_holder;
}
+ fields_arg->set_table_holder(table_holder, table_count);
keep_going = TRUE;
it.init(*query->select);
while ((item = it++))
@@ -1844,21 +1650,9 @@ group_by_handler *spider_create_group_by_handler(
}
}
if (!find_dbton)
- {
- DBUG_RETURN(NULL);
- }
-
- if (fields->create_table_holder(table_idx))
- {
- delete fields;
- DBUG_RETURN(NULL);
- }
+ goto skip_free_table_holder;
from = query->from;
- while (from->table->const_table)
- {
- from = from->next_local;
- }
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1879,17 +1673,10 @@ group_by_handler *spider_create_group_by_handler(
}
DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
- if (!fields->add_table(spider))
- {
- DBUG_PRINT("info",("spider can not add a table"));
- delete fields;
- DBUG_RETURN(NULL);
- }
if (spider->dml_init())
{
DBUG_PRINT("info",("spider can not init for dml"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -1909,8 +1696,7 @@ group_by_handler *spider_create_group_by_handler(
DBUG_PRINT("info",("spider direct_join does not support with lock tables yet"));
if (lock_mode)
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
continue;
}
@@ -1918,26 +1704,21 @@ group_by_handler *spider_create_group_by_handler(
share->access_balances[spider->conn_link_idx[roop_count]]))
{
DBUG_PRINT("info",("spider can not create conn_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
{
DBUG_PRINT("info",("spider can not create link_idx_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
if (!fields->has_conn_holder())
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
while ((from = from->next_local))
{
- if (from->table->const_table)
- continue;
fields->clear_conn_holder_from_conn();
if (from->table->part_info)
@@ -1951,19 +1732,12 @@ group_by_handler *spider_create_group_by_handler(
spider = (ha_spider *) from->table->file;
}
share = spider->share;
- if (!fields->add_table(spider))
- {
- DBUG_PRINT("info",("spider can not add a table"));
- delete fields;
- DBUG_RETURN(NULL);
- }
DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
if (spider->dml_init())
{
DBUG_PRINT("info",("spider can not init for dml"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -1982,17 +1756,13 @@ group_by_handler *spider_create_group_by_handler(
DBUG_PRINT("info",("spider connection %p can not be used for this query with locking",
conn));
if (lock_mode)
- {
- delete fields;
- DBUG_RETURN(NULL);
- }
+ goto skip_free_fields;
continue;
}
if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
{
DBUG_PRINT("info",("spider can not create link_idx_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
@@ -2001,30 +1771,20 @@ group_by_handler *spider_create_group_by_handler(
if (lock_mode)
{
DBUG_PRINT("info",("spider some connections can not be used for this query with locking"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
if (!fields->has_conn_holder())
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
- if (!fields->all_query_fields_are_query_table_members())
- {
- DBUG_PRINT("info", ("spider found a query field that is not a query table member"));
- delete fields;
- DBUG_RETURN(NULL);
- }
-
fields->check_support_dbton(dbton_bitmap);
if (!fields->has_conn_holder())
{
DBUG_PRINT("info",("spider all chosen connections can't match dbton_id"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
/* choose a connection */
@@ -2036,16 +1796,14 @@ group_by_handler *spider_create_group_by_handler(
if (fields->make_link_idx_chain(tgt_link_status))
{
DBUG_PRINT("info",("spider can not create link_idx_chain"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
/* choose link_id */
if (fields->check_link_ok_chain())
{
DBUG_PRINT("info",("spider do not have link ok status"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
fields->set_first_link_idx();
@@ -2053,8 +1811,7 @@ group_by_handler *spider_create_group_by_handler(
if (!(group_by_handler = new spider_group_by_handler(thd, query, fields)))
{
DBUG_PRINT("info",("spider can't create group_by_handler"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
query->distinct = FALSE;
query->where = NULL;
@@ -2062,4 +1819,10 @@ group_by_handler *spider_create_group_by_handler(
query->having = NULL;
query->order_by = NULL;
DBUG_RETURN(group_by_handler);
+
+skip_free_fields:
+ delete fields;
+skip_free_table_holder:
+ spider_free(spider_current_trx, table_holder, MYF(0));
+ DBUG_RETURN(NULL);
}