summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKentoku SHIBA <kentokushiba@gmail.com>2013-09-17 03:22:54 +0900
committerKentoku SHIBA <kentokushiba@gmail.com>2013-09-17 03:22:54 +0900
commitdc01d230ed2f0f693e0444c64638743bd57774ed (patch)
tree859704fa52313f74cc0fb374dc59915f1cd01b69
parente9d53a384cdfd4174bc1c69100cf04006d217ec7 (diff)
downloadmariadb-git-dc01d230ed2f0f693e0444c64638743bd57774ed.tar.gz
add some direct aggregate feature.
-rw-r--r--storage/spider/ha_spider.cc96
-rw-r--r--storage/spider/ha_spider.h15
-rw-r--r--storage/spider/spd_db_conn.cc296
-rw-r--r--storage/spider/spd_db_conn.h28
-rw-r--r--storage/spider/spd_db_handlersocket.cc108
-rw-r--r--storage/spider/spd_db_handlersocket.h20
-rw-r--r--storage/spider/spd_db_include.h36
-rw-r--r--storage/spider/spd_db_mysql.cc211
-rw-r--r--storage/spider/spd_db_mysql.h32
-rw-r--r--storage/spider/spd_db_oracle.cc211
-rw-r--r--storage/spider/spd_db_oracle.h32
-rw-r--r--storage/spider/spd_include.h9
-rw-r--r--storage/spider/spd_table.cc124
13 files changed, 1181 insertions, 37 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index c069ddfb770..3e56cda98b7 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -126,6 +126,10 @@ ha_spider::ha_spider(
init_ha_mem_root = FALSE;
*/
#endif
+ prev_index_rnd_init = SPD_NONE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ direct_aggregate_item_first = NULL;
+#endif
result_link_idx = 0;
result_list.have_sql_kind_backup = FALSE;
result_list.sqls = NULL;
@@ -144,6 +148,9 @@ ha_spider::ha_spider(
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
result_list.tmp_pos_row_first = NULL;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list.direct_aggregate = FALSE;
+#endif
DBUG_VOID_RETURN;
}
@@ -220,6 +227,10 @@ ha_spider::ha_spider(
init_ha_mem_root = FALSE;
*/
#endif
+ prev_index_rnd_init = SPD_NONE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ direct_aggregate_item_first = NULL;
+#endif
result_link_idx = 0;
result_list.have_sql_kind_backup = FALSE;
result_list.sqls = NULL;
@@ -238,6 +249,9 @@ ha_spider::ha_spider(
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
result_list.tmp_pos_row_first = NULL;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list.direct_aggregate = FALSE;
+#endif
ref_length = sizeof(SPIDER_POSITION);
DBUG_VOID_RETURN;
}
@@ -641,6 +655,18 @@ int ha_spider::close()
} while (bulk_access_link_first);
}
#endif
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ while (direct_aggregate_item_first)
+ {
+ direct_aggregate_item_current = direct_aggregate_item_first->next;
+ if (direct_aggregate_item_first->item)
+ {
+ delete direct_aggregate_item_first->item;
+ }
+ spider_free(spider_current_trx, direct_aggregate_item_first, MYF(0));
+ direct_aggregate_item_first = direct_aggregate_item_current;
+ }
+#endif
if (is_clone)
{
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
@@ -1539,6 +1565,19 @@ int ha_spider::reset()
} while (bulk_access_link_first);
}
#endif
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ direct_aggregate_item_current = direct_aggregate_item_first;
+ while (direct_aggregate_item_current)
+ {
+ if (direct_aggregate_item_current->item)
+ {
+ delete direct_aggregate_item_current->item;
+ direct_aggregate_item_current->item = NULL;
+ }
+ direct_aggregate_item_current = direct_aggregate_item_current->next;
+ }
+ result_list.direct_aggregate = FALSE;
+#endif
store_error_num = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (
@@ -1714,6 +1753,7 @@ int ha_spider::reset()
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
info_limit = 9223372036854775807LL;
#endif
+ prev_index_rnd_init = SPD_NONE;
result_list.have_sql_kind_backup = FALSE;
result_list.direct_order_limit = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -1861,6 +1901,7 @@ int ha_spider::index_init(
DBUG_RETURN(error_num);
#endif
result_list.check_direct_order_limit = FALSE;
+ prev_index_rnd_init = SPD_INDEX;
DBUG_RETURN(0);
}
@@ -5136,6 +5177,10 @@ int ha_spider::read_multi_range_first_internal(
DBUG_RETURN(error_num);
result_list.use_union = TRUE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ bool direct_aggregate_backup = result_list.direct_aggregate;
+ result_list.direct_aggregate = FALSE;
+#endif
if (result_list.direct_order_limit)
{
if ((error_num =
@@ -5147,6 +5192,9 @@ int ha_spider::read_multi_range_first_internal(
NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list.direct_aggregate = direct_aggregate_backup;
+#endif
if ((error_num = append_limit_sql_part(
result_list.internal_offset,
result_list.limit_num,
@@ -6486,6 +6534,10 @@ int ha_spider::read_multi_range_next(
DBUG_RETURN(error_num);
result_list.use_union = TRUE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ bool direct_aggregate_backup = result_list.direct_aggregate;
+ result_list.direct_aggregate = FALSE;
+#endif
if (result_list.direct_order_limit)
{
if ((error_num =
@@ -6497,6 +6549,9 @@ int ha_spider::read_multi_range_next(
NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list.direct_aggregate = direct_aggregate_backup;
+#endif
if ((error_num = append_limit_sql_part(
result_list.internal_offset,
result_list.limit_num,
@@ -6882,6 +6937,7 @@ int ha_spider::rnd_init(
int error_num;
DBUG_ENTER("ha_spider::rnd_init");
DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider scan=%s", scan ? "TRUE" : "FALSE"));
pushed_pos = NULL;
if (result_list.lock_type == F_WRLCK)
check_and_start_bulk_update(SPD_BU_START_BY_INDEX_OR_RND_INIT);
@@ -6895,7 +6951,8 @@ int ha_spider::rnd_init(
pk_update = FALSE;
if (
result_list.current &&
- !result_list.low_mem_read
+ !result_list.low_mem_read &&
+ prev_index_rnd_init == SPD_RND
) {
result_list.current = result_list.first;
spider_db_set_pos_to_first_row(&result_list);
@@ -6978,6 +7035,7 @@ int ha_spider::rnd_init(
result_list.check_direct_order_limit = FALSE;
}
}
+ prev_index_rnd_init = SPD_RND;
DBUG_RETURN(0);
}
@@ -10708,6 +10766,16 @@ int ha_spider::info_push(
DBUG_RETURN(error_num);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+void ha_spider::return_record_by_parent()
+{
+ DBUG_ENTER("ha_spider::return_record_by_parent");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_db_refetch_for_item_sum_funcs(this);
+ DBUG_VOID_RETURN;
+}
+#endif
+
TABLE *ha_spider::get_table()
{
DBUG_ENTER("ha_spider::get_table");
@@ -12920,6 +12988,32 @@ int ha_spider::append_condition_sql_part(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int ha_spider::append_sum_select_sql_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ uint roop_count, dbton_id;
+ spider_db_handler *dbton_hdl;
+ DBUG_ENTER("ha_spider::append_sum_select_sql_part");
+ for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
+ {
+ dbton_id = share->use_sql_dbton_ids[roop_count];
+ dbton_hdl = dbton_handler[dbton_id];
+ if (
+ dbton_hdl->first_link_idx >= 0 &&
+ (error_num = dbton_hdl->append_sum_select_part(sql_type,
+ alias, alias_length))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int ha_spider::append_match_select_sql_part(
ulong sql_type,
const char *alias,
diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h
index 50ddeb1c050..4d1f6067bdc 100644
--- a/storage/spider/ha_spider.h
+++ b/storage/spider/ha_spider.h
@@ -227,6 +227,11 @@ public:
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
longlong info_limit;
#endif
+ spider_index_rnd_init prev_index_rnd_init;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ SPIDER_ITEM_HLD *direct_aggregate_item_first;
+ SPIDER_ITEM_HLD *direct_aggregate_item_current;
+#endif
/* for fulltext search */
bool ft_init_and_first;
@@ -697,6 +702,9 @@ public:
uint info_type,
void *info
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ void return_record_by_parent();
+#endif
TABLE *get_table();
void set_ft_discard_bitmap();
void set_searched_bitmap();
@@ -918,6 +926,13 @@ public:
ulong sql_type,
bool test_flg
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_sql_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+#endif
int append_match_select_sql_part(
ulong sql_type,
const char *alias,
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index 9eeab73bb05..a582fb4c270 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -26,6 +26,9 @@
#include "sql_analyse.h"
#include "sql_base.h"
#include "tztime.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
#endif
#include "sql_common.h"
#include <errmsg.h>
@@ -1365,6 +1368,14 @@ int spider_db_append_select_columns(
DBUG_ENTER("spider_db_append_select_columns");
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (
+ result_list->direct_aggregate &&
+ (error_num = spider->append_sum_select_sql_part(
+ SPIDER_SQL_TYPE_SELECT_SQL, NULL, 0))
+ )
+ DBUG_RETURN(error_num);
+#endif
if ((error_num = spider->append_match_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL, NULL, 0)))
DBUG_RETURN(error_num);
@@ -2359,6 +2370,163 @@ int spider_db_append_key_where(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_refetch_for_item_sum_funcs(
+ ha_spider *spider
+) {
+ int error_num;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_db_refetch_for_item_sum_funcs");
+ if (result_list->snap_direct_aggregate)
+ {
+ SPIDER_DB_ROW *row = result_list->snap_row;
+ row->first();
+ if (result_list->snap_mrr_with_cnt)
+ {
+ row->next();
+ }
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_fetch_for_item_sum_funcs(
+ SPIDER_DB_ROW *row,
+ ha_spider *spider
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_db_fetch_for_item_sum_funcs");
+ select_lex = spider_get_select_lex(spider);
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ spider->direct_aggregate_item_current = NULL;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_func(row, *item_sum_ptr,
+ spider)))
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_fetch_for_item_sum_func(
+ SPIDER_DB_ROW *row,
+ Item_sum *item_sum,
+ ha_spider *spider
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_db_fetch_for_item_sum_func");
+ DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
+ switch (item_sum->sum_func())
+ {
+ case Item_sum::COUNT_FUNC:
+ {
+ Item_sum_count *item_sum_count = (Item_sum_count *) item_sum;
+ if (!row->is_null())
+ item_sum_count->direct_add(row->val_int());
+ else
+ DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
+ row->next();
+ }
+ break;
+ case Item_sum::SUM_FUNC:
+ {
+ Item_sum_sum *item_sum_sum = (Item_sum_sum *) item_sum;
+ if (item_sum_sum->result_type() == DECIMAL_RESULT)
+ {
+ my_decimal decimal_value;
+ item_sum_sum->direct_add(row->val_decimal(&decimal_value,
+ share->access_charset));
+ } else {
+ item_sum_sum->direct_add(row->val_real(), row->is_null());
+ }
+ row->next();
+ }
+ break;
+ case Item_sum::MIN_FUNC:
+ case Item_sum::MAX_FUNC:
+ {
+ if (!spider->direct_aggregate_item_current)
+ {
+ if (!spider->direct_aggregate_item_first)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 240, MYF(MY_WME),
+ &spider->direct_aggregate_item_first, sizeof(SPIDER_ITEM_HLD),
+ NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider->direct_aggregate_item_first->next = NULL;
+ spider->direct_aggregate_item_first->item = NULL;
+ spider->direct_aggregate_item_first->tgt_num = 0;
+ }
+ spider->direct_aggregate_item_current =
+ spider->direct_aggregate_item_first;
+ } else {
+ if (!spider->direct_aggregate_item_current->next)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 241, MYF(MY_WME),
+ &spider->direct_aggregate_item_current->next,
+ sizeof(SPIDER_ITEM_HLD), NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider->direct_aggregate_item_current->next->next = NULL;
+ spider->direct_aggregate_item_current->next->item = NULL;
+ spider->direct_aggregate_item_current->next->tgt_num =
+ spider->direct_aggregate_item_current->tgt_num + 1;
+ }
+ spider->direct_aggregate_item_current =
+ spider->direct_aggregate_item_current->next;
+ }
+ if (!spider->direct_aggregate_item_current->item)
+ {
+ spider->direct_aggregate_item_current->item =
+ new Item_string(share->access_charset);
+ if (!spider->direct_aggregate_item_current->item)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ Item_sum_hybrid *item_hybrid = (Item_sum_hybrid *) item_sum;
+ Item_string *item =
+ (Item_string *) spider->direct_aggregate_item_current->item;
+ if (row->is_null())
+ {
+ item->set_str_with_copy(NULL, 0);
+ item->null_value = TRUE;
+ } else {
+ char buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
+ tmp_str.init_calc_mem(242);
+ tmp_str.length(0);
+ if ((error_num = row->append_to_str(&tmp_str)))
+ DBUG_RETURN(error_num);
+ item->set_str_with_copy(tmp_str.ptr(), tmp_str.length());
+ item->null_value = FALSE;
+ }
+ item_hybrid->direct_add(item);
+ row->next();
+ }
+ break;
+ case Item_sum::COUNT_DISTINCT_FUNC:
+ case Item_sum::SUM_DISTINCT_FUNC:
+ case Item_sum::AVG_FUNC:
+ case Item_sum::AVG_DISTINCT_FUNC:
+ case Item_sum::STD_FUNC:
+ case Item_sum::VARIANCE_FUNC:
+ case Item_sum::SUM_BIT_FUNC:
+ case Item_sum::UDF_SUM_FUNC:
+ case Item_sum::GROUP_CONCAT_FUNC:
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_db_append_match_fetch(
ha_spider *spider,
st_spider_ft_info *ft_first,
@@ -2556,6 +2724,12 @@ int spider_db_fetch_table(
}
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
+ result_list->snap_direct_aggregate = result_list->direct_aggregate;
+ result_list->snap_row = row;
+#endif
+
/* for mrr */
if (spider->mrr_with_cnt)
{
@@ -2567,10 +2741,23 @@ int spider_db_fetch_table(
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
- } else
+ } else {
spider->multi_range_hit_point = 0;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list->snap_mrr_with_cnt = FALSE;
+#endif
+ }
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (result_list->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
@@ -2717,6 +2904,12 @@ int spider_db_fetch_key(
}
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
+ result_list->snap_direct_aggregate = result_list->direct_aggregate;
+ result_list->snap_row = row;
+#endif
+
/* for mrr */
if (spider->mrr_with_cnt)
{
@@ -2727,6 +2920,16 @@ int spider_db_fetch_key(
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (result_list->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
@@ -2798,6 +3001,12 @@ int spider_db_fetch_minimum_columns(
}
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
+ result_list->snap_direct_aggregate = result_list->direct_aggregate;
+ result_list->snap_row = row;
+#endif
+
/* for mrr */
if (spider->mrr_with_cnt)
{
@@ -2808,6 +3017,16 @@ int spider_db_fetch_minimum_columns(
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (result_list->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
@@ -4527,6 +4746,9 @@ void spider_db_create_position(
current->use_position = TRUE;
pos->use_position = TRUE;
pos->mrr_with_cnt = spider->mrr_with_cnt;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ pos->direct_aggregate = result_list->direct_aggregate;
+#endif
pos->sql_kind = spider->sql_kind[spider->result_link_idx];
pos->position_bitmap = spider->position_bitmap;
pos->ft_first = spider->ft_first;
@@ -4591,6 +4813,12 @@ int spider_db_seek_tmp_table(
*/
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
+ spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
+ spider->result_list.snap_row = row;
+#endif
+
/* for mrr */
if (pos->mrr_with_cnt)
{
@@ -4598,8 +4826,22 @@ int spider_db_seek_tmp_table(
if (pos->sql_kind == SPIDER_SQL_KIND_SQL)
{
row->next();
+ } else {
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.snap_mrr_with_cnt = FALSE;
+#endif
}
}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (pos->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
@@ -4656,12 +4898,28 @@ int spider_db_seek_tmp_key(
*/
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
+ spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
+ spider->result_list.snap_row = row;
+#endif
+
/* for mrr */
if (pos->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
row->next();
}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (pos->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
@@ -4718,12 +4976,28 @@ int spider_db_seek_tmp_minimum_columns(
*/
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
+ spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
+ spider->result_list.snap_row = row;
+#endif
+
/* for mrr */
if (pos->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
row->next();
}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ /* for direct_aggregate */
+ if (pos->direct_aggregate)
+ {
+ if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
@@ -7241,6 +7515,11 @@ int spider_db_print_item_type(
case Item::FUNC_ITEM:
DBUG_RETURN(spider_db_open_item_func((Item_func *) item, spider, str,
alias, alias_length, dbton_id));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ case Item::SUM_FUNC_ITEM:
+ DBUG_RETURN(spider_db_open_item_sum_func((Item_sum *)item, spider, str,
+ alias, alias_length, dbton_id));
+#endif
case Item::COND_ITEM:
DBUG_RETURN(spider_db_open_item_cond((Item_cond *) item, spider, str,
alias, alias_length, dbton_id));
@@ -7388,6 +7667,21 @@ int spider_db_open_item_func(
item_func, spider, str, alias, alias_length));
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ uint dbton_id
+) {
+ DBUG_ENTER("spider_db_open_item_func");
+ DBUG_RETURN(spider_dbton[dbton_id].db_util->open_item_sum_func(
+ item_sum, spider, str, alias, alias_length));
+}
+#endif
+
int spider_db_open_item_ident(
Item_ident *item_ident,
ha_spider *spider,
diff --git a/storage/spider/spd_db_conn.h b/storage/spider/spd_db_conn.h
index d819255394d..3a5cc1b6181 100644
--- a/storage/spider/spd_db_conn.h
+++ b/storage/spider/spd_db_conn.h
@@ -421,6 +421,23 @@ int spider_db_append_key_where(
ha_spider *spider
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_refetch_for_item_sum_funcs(
+ ha_spider *spider
+);
+
+int spider_db_fetch_for_item_sum_funcs(
+ SPIDER_DB_ROW *row,
+ ha_spider *spider
+);
+
+int spider_db_fetch_for_item_sum_func(
+ SPIDER_DB_ROW *row,
+ Item_sum *item_sum,
+ ha_spider *spider
+);
+#endif
+
int spider_db_append_match_fetch(
ha_spider *spider,
st_spider_ft_info *ft_first,
@@ -793,6 +810,17 @@ int spider_db_open_item_func(
uint dbton_id
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ uint dbton_id
+);
+#endif
+
int spider_db_open_item_ident(
Item_ident *item_ident,
ha_spider *spider,
diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc
index 876eeeb656c..8d5c52d6bf2 100644
--- a/storage/spider/spd_db_handlersocket.cc
+++ b/storage/spider/spd_db_handlersocket.cc
@@ -463,6 +463,26 @@ double spider_db_handlersocket_row::val_real()
DBUG_RETURN(hs_row->begin() ? my_atof(hs_row->begin()) : 0.0);
}
+my_decimal *spider_db_handlersocket_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!hs_row->begin())
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
+ access_charset, decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
+ access_charset, decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
{
spider_db_handlersocket_row *clone_row;
@@ -3375,6 +3395,81 @@ int spider_db_handlersocket_util::open_item_func(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_handlersocket_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_handlersocket.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_handlersocket_util::open_item_sum_func");
+ DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
+ switch (item_sum->sum_func())
+ {
+ case Item_sum::COUNT_FUNC:
+ case Item_sum::SUM_FUNC:
+ case Item_sum::MIN_FUNC:
+ case Item_sum::MAX_FUNC:
+ {
+ const char *func_name = item_sum->func_name();
+ uint func_name_length = strlen(func_name);
+ Item *item, **args = item_sum->get_args();
+ if (str)
+ {
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = 0; roop_count < item_count; roop_count++)
+ {
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ break;
+ case Item_sum::COUNT_DISTINCT_FUNC:
+ case Item_sum::SUM_DISTINCT_FUNC:
+ case Item_sum::AVG_FUNC:
+ case Item_sum::AVG_DISTINCT_FUNC:
+ case Item_sum::STD_FUNC:
+ case Item_sum::VARIANCE_FUNC:
+ case Item_sum::SUM_BIT_FUNC:
+ case Item_sum::UDF_SUM_FUNC:
+ case Item_sum::GROUP_CONCAT_FUNC:
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_db_handlersocket_util::append_escaped_util(
spider_string *to,
String *from
@@ -4322,6 +4417,19 @@ int spider_handlersocket_handler::append_match_select_part(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_handlersocket_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
void spider_handlersocket_handler::set_order_pos(
ulong sql_type
) {
diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h
index ed3d55752bc..7d93598ecc8 100644
--- a/storage/spider/spd_db_handlersocket.h
+++ b/storage/spider/spd_db_handlersocket.h
@@ -96,6 +96,15 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
int append_escaped_util(
spider_string *to,
String *from
@@ -127,6 +136,10 @@ public:
bool is_null();
int val_int();
double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
SPIDER_DB_ROW *clone();
int store_to_tmp_table(
TABLE *tmp_table,
@@ -645,6 +658,13 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+#endif
void set_order_pos(
ulong sql_type
);
diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h
index c51bca146cd..218358c631d 100644
--- a/storage/spider/spd_db_include.h
+++ b/storage/spider/spd_db_include.h
@@ -28,6 +28,7 @@
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100004
#define SPIDER_HAS_TIME_STATUS
+#define SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
#endif
class spider_db_conn;
@@ -191,6 +192,12 @@ enum spider_bulk_upd_start {
SPD_BU_START_BY_BULK_INIT
};
+enum spider_index_rnd_init {
+ SPD_NONE,
+ SPD_INDEX,
+ SPD_RND
+};
+
struct st_spider_ft_info;
struct st_spider_result;
typedef struct st_spider_transaction SPIDER_TRX;
@@ -645,6 +652,15 @@ public:
const char *alias,
uint alias_length
) = 0;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ virtual int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ ) = 0;
+#endif
virtual int append_escaped_util(
spider_string *to,
String *from
@@ -674,6 +690,10 @@ public:
virtual bool is_null() = 0;
virtual int val_int() = 0;
virtual double val_real() = 0;
+ virtual my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ ) = 0;
virtual SPIDER_DB_ROW *clone() = 0;
virtual int store_to_tmp_table(
TABLE *tmp_table,
@@ -1121,6 +1141,13 @@ public:
const char *alias,
uint alias_length
) = 0;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ virtual int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ ) = 0;
+#endif
virtual void set_order_pos(
ulong sql_type
) = 0;
@@ -1475,6 +1502,9 @@ typedef struct st_spider_position
uint pos_mode;
bool use_position;
bool mrr_with_cnt;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ bool direct_aggregate;
+#endif
uint sql_kind;
uchar *position_bitmap;
st_spider_ft_info *ft_first;
@@ -1579,6 +1609,12 @@ typedef struct st_spider_result_list
spider_bulk_upd_start bulk_update_start;
bool check_direct_order_limit;
bool direct_order_limit;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ bool direct_aggregate;
+ bool snap_mrr_with_cnt;
+ bool snap_direct_aggregate;
+ SPIDER_DB_ROW *snap_row;
+#endif
bool set_split_read;
bool insert_dup_update_pushdown;
longlong split_read_base;
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index f6ef1ff947e..a09b9e4a804 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -26,6 +26,9 @@
#include "sql_analyse.h"
#include "sql_base.h"
#include "tztime.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
#endif
#include "sql_common.h"
#include <mysql.h>
@@ -336,6 +339,26 @@ double spider_db_mysql_row::val_real()
DBUG_RETURN(*row ? my_atof(*row) : 0.0);
}
+my_decimal *spider_db_mysql_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_mysql_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!*row)
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
+ decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
+ decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
SPIDER_DB_ROW *spider_db_mysql_row::clone()
{
spider_db_mysql_row *clone_row;
@@ -3613,6 +3636,81 @@ int spider_db_mysql_util::open_item_func(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_mysql_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_mysql_util::open_item_sum_func");
+ DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
+ switch (item_sum->sum_func())
+ {
+ case Item_sum::COUNT_FUNC:
+ case Item_sum::SUM_FUNC:
+ case Item_sum::MIN_FUNC:
+ case Item_sum::MAX_FUNC:
+ {
+ const char *func_name = item_sum->func_name();
+ uint func_name_length = strlen(func_name);
+ Item *item, **args = item_sum->get_args();
+ if (str)
+ {
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = 0; roop_count < item_count; roop_count++)
+ {
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ break;
+ case Item_sum::COUNT_DISTINCT_FUNC:
+ case Item_sum::SUM_DISTINCT_FUNC:
+ case Item_sum::AVG_FUNC:
+ case Item_sum::AVG_DISTINCT_FUNC:
+ case Item_sum::STD_FUNC:
+ case Item_sum::VARIANCE_FUNC:
+ case Item_sum::SUM_BIT_FUNC:
+ case Item_sum::UDF_SUM_FUNC:
+ case Item_sum::GROUP_CONCAT_FUNC:
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_db_mysql_util::append_escaped_util(
spider_string *to,
String *from
@@ -5987,6 +6085,13 @@ int spider_mysql_handler::append_select_columns_with_alias(
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_mysql_handler::append_select_columns_with_alias");
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (
+ result_list->direct_aggregate &&
+ (error_num = append_sum_select(str, alias, alias_length))
+ )
+ DBUG_RETURN(error_num);
+#endif
if ((error_num = append_match_select(str, alias, alias_length)))
DBUG_RETURN(error_num);
if (!spider->select_column_mode)
@@ -7038,6 +7143,55 @@ int spider_mysql_handler::append_match_select(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_mysql_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_sum_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_mysql_handler::append_sum_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if ((error_num = spider_db_mysql_utility.open_item_sum_func(*item_sum_ptr,
+ spider, str, alias, alias_length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
void spider_mysql_handler::set_order_pos(
ulong sql_type
) {
@@ -7090,6 +7244,40 @@ void spider_mysql_handler::set_order_to_pos(
DBUG_VOID_RETURN;
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_mysql_handler::append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_mysql_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ ORDER *group = (ORDER *) select_lex->group_list.first;
+ if (group)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; group; group = group->next)
+ {
+ if ((error_num = spider_db_print_item_type((*group->item), spider, str,
+ alias, alias_length, spider_dbton_mysql.dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_mysql_handler::append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
@@ -7134,6 +7322,14 @@ int spider_mysql_handler::append_key_order_for_merge_with_alias(
uint key_name_length;
DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
if (table->s->primary_key < MAX_KEY)
{
/* sort by primary key */
@@ -7242,6 +7438,13 @@ int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
longlong offset_limit;
DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
spider_get_select_limit(spider, &select_lex, &select_limit,
&offset_limit);
if (select_lex->order_list.first)
@@ -7337,6 +7540,14 @@ int spider_mysql_handler::append_key_order_with_alias(
uint key_name_length;
DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
if (result_list->sorted == TRUE)
{
if (result_list->desc_flg == TRUE)
diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h
index 71d6a262cf8..b95d4e6e1a2 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -101,6 +101,15 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
int append_escaped_util(
spider_string *to,
String *from
@@ -134,6 +143,10 @@ public:
bool is_null();
int val_int();
double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
SPIDER_DB_ROW *clone();
int store_to_tmp_table(
TABLE *tmp_table,
@@ -845,12 +858,31 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
void set_order_pos(
ulong sql_type
);
void set_order_to_pos(
ulong sql_type
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
int append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc
index 1254dd8332e..9631f6505d5 100644
--- a/storage/spider/spd_db_oracle.cc
+++ b/storage/spider/spd_db_oracle.cc
@@ -23,6 +23,9 @@
#include "probes_mysql.h"
#include "sql_partition.h"
#include "sql_analyse.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
#endif
#ifdef HAVE_ORACLE_OCI
@@ -466,6 +469,26 @@ double spider_db_oracle_row::val_real()
DBUG_RETURN((*ind != -1) ? my_atof(*val) : 0.0);
}
+my_decimal *spider_db_oracle_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (*ind == -1)
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
+ decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
+ decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
SPIDER_DB_ROW *spider_db_oracle_row::clone()
{
uint i;
@@ -3658,6 +3681,81 @@ int spider_db_oracle_util::open_item_func(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_oracle_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_oracle_util::open_item_sum_func");
+ DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
+ switch (item_sum->sum_func())
+ {
+ case Item_sum::COUNT_FUNC:
+ case Item_sum::SUM_FUNC:
+ case Item_sum::MIN_FUNC:
+ case Item_sum::MAX_FUNC:
+ {
+ const char *func_name = item_sum->func_name();
+ uint func_name_length = strlen(func_name);
+ Item *item, **args = item_sum->get_args();
+ if (str)
+ {
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = 0; roop_count < item_count; roop_count++)
+ {
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ break;
+ case Item_sum::COUNT_DISTINCT_FUNC:
+ case Item_sum::SUM_DISTINCT_FUNC:
+ case Item_sum::AVG_FUNC:
+ case Item_sum::AVG_DISTINCT_FUNC:
+ case Item_sum::STD_FUNC:
+ case Item_sum::VARIANCE_FUNC:
+ case Item_sum::SUM_BIT_FUNC:
+ case Item_sum::UDF_SUM_FUNC:
+ case Item_sum::GROUP_CONCAT_FUNC:
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
size_t spider_db_oracle_util::escape_string(
char *to,
const char *from,
@@ -6001,6 +6099,13 @@ int spider_oracle_handler::append_select_columns_with_alias(
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_oracle_handler::append_select_columns_with_alias");
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (
+ result_list->direct_aggregate &&
+ (error_num = append_sum_select(str, alias, alias_length))
+ )
+ DBUG_RETURN(error_num);
+#endif
if ((error_num = append_match_select(str, alias, alias_length)))
DBUG_RETURN(error_num);
if (!spider->select_column_mode)
@@ -7065,6 +7170,55 @@ int spider_oracle_handler::append_match_select(
DBUG_RETURN(0);
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_oracle_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_sum_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_oracle_handler::append_sum_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if ((error_num = spider_db_oracle_utility.open_item_sum_func(*item_sum_ptr,
+ spider, str, alias, alias_length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
void spider_oracle_handler::set_order_pos(
ulong sql_type
) {
@@ -7117,6 +7271,40 @@ void spider_oracle_handler::set_order_to_pos(
DBUG_VOID_RETURN;
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_oracle_handler::append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_oracle_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ ORDER *group = (ORDER *) select_lex->group_list.first;
+ if (group)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; group; group = group->next)
+ {
+ if ((error_num = spider_db_print_item_type((*group->item), spider, str,
+ alias, alias_length, spider_dbton_oracle.dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_oracle_handler::append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
@@ -7161,6 +7349,14 @@ int spider_oracle_handler::append_key_order_for_merge_with_alias(
uint key_name_length;
DBUG_ENTER("spider_oracle_handler::append_key_order_for_merge_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
if (
spider->result_list.direct_order_limit ||
spider->result_list.internal_limit < 9223372036854775807LL ||
@@ -7383,6 +7579,13 @@ int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias(
longlong offset_limit;
DBUG_ENTER("spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
spider_get_select_limit(spider, &select_lex, &select_limit,
&offset_limit);
if (
@@ -7601,6 +7804,14 @@ int spider_oracle_handler::append_key_order_with_alias(
uint key_name_length;
DBUG_ENTER("spider_oracle_handler::append_key_order_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
if (
spider->result_list.direct_order_limit ||
spider->result_list.internal_limit < 9223372036854775807LL ||
diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h
index db5eac88ca9..7b43b9d5e0b 100644
--- a/storage/spider/spd_db_oracle.h
+++ b/storage/spider/spd_db_oracle.h
@@ -104,6 +104,15 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
size_t escape_string(
char *to,
const char *from,
@@ -159,6 +168,10 @@ public:
bool is_null();
int val_int();
double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
SPIDER_DB_ROW *clone();
int store_to_tmp_table(
TABLE *tmp_table,
@@ -928,12 +941,31 @@ public:
const char *alias,
uint alias_length
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
void set_order_pos(
ulong sql_type
);
void set_order_to_pos(
ulong sql_type
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
int append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 6db537462ef..9eaeeb99139 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -118,7 +118,7 @@
#define SPIDER_TMP_SHARE_LONG_COUNT 15
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
-#define SPIDER_MEM_CALC_LIST_NUM 240
+#define SPIDER_MEM_CALC_LIST_NUM 243
#define SPIDER_BACKUP_DASTATUS \
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
@@ -1158,6 +1158,13 @@ typedef struct st_spider_int_hld
st_spider_int_hld *next;
} SPIDER_INT_HLD;
+typedef struct st_spider_item_hld
+{
+ uint tgt_num;
+ Item *item;
+ st_spider_item_hld *next;
+} SPIDER_ITEM_HLD;
+
char *spider_create_string(
const char *str,
uint length
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index a06aeb6adc7..bb94928bfe3 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -25,6 +25,9 @@
#include "sql_class.h"
#include "sql_partition.h"
#include "sql_servers.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
#endif
#include "spd_err.h"
#include "spd_param.h"
@@ -7478,17 +7481,17 @@ bool spider_check_direct_order_limit(
) {
THD *thd = spider->trx->thd;
SPIDER_SHARE *share = spider->share;
- longlong direct_order_limit = spider_param_direct_order_limit(thd,
- share->direct_order_limit);
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
DBUG_ENTER("spider_check_direct_order_limit");
- if (
- direct_order_limit &&
- spider->sql_command != SQLCOM_HA_READ
- ) {
- st_select_lex *select_lex;
- longlong select_limit;
- longlong offset_limit;
+ if (spider->sql_command != SQLCOM_HA_READ)
+ {
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
+ bool first_check = TRUE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.direct_aggregate = TRUE;
+#endif
DBUG_PRINT("info",("spider select_limit=%lld", select_limit));
DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit));
if (
@@ -7499,38 +7502,91 @@ bool spider_check_direct_order_limit(
OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) ||
#endif
!select_lex ||
- !select_lex->explicit_limit ||
- (select_lex->options & OPTION_FOUND_ROWS) ||
- select_lex->group_list.elements ||
- select_lex->with_sum_func ||
- select_lex->having ||
- select_lex->table_list.elements != 1 ||
- !select_lex->order_list.elements ||
- select_limit > direct_order_limit - offset_limit
+ select_lex->table_list.elements != 1
) {
- DBUG_PRINT("info",("spider FALSE by select_lex"));
- DBUG_RETURN(FALSE);
- }
- ORDER *order;
- for (order = (ORDER *) select_lex->order_list.first; order;
- order = order->next)
+ DBUG_PRINT("info",("spider first_check is FALSE"));
+ first_check = FALSE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.direct_aggregate = FALSE;
+#endif
+ } else if (spider_db_append_condition(spider, NULL, 0, TRUE))
{
- if (spider->print_item_type((*order->item), NULL, NULL, 0))
+ DBUG_PRINT("info",("spider FALSE by condition"));
+ first_check = FALSE;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.direct_aggregate = FALSE;
+ } else if (
+ !select_lex->group_list.elements &&
+ !select_lex->with_sum_func
+ ) {
+ DBUG_PRINT("info",("spider this SQL is not aggregate SQL"));
+ spider->result_list.direct_aggregate = FALSE;
+ } else {
+ ORDER *group;
+ for (group = (ORDER *) select_lex->group_list.first; group;
+ group = group->next)
{
- DBUG_PRINT("info",("spider FALSE by order"));
- DBUG_RETURN(FALSE);
+ if (spider->print_item_type((*group->item), NULL, NULL, 0))
+ {
+ DBUG_PRINT("info",("spider aggregate FALSE by group"));
+ spider->result_list.direct_aggregate = FALSE;
+ break;
+ }
}
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if (spider->print_item_type(*item_sum_ptr, NULL, NULL, 0))
+ {
+ DBUG_PRINT("info",("spider aggregate FALSE by not supported"));
+ spider->result_list.direct_aggregate = FALSE;
+ break;
+ }
+ }
+#endif
}
- if (spider_db_append_condition(spider, NULL, 0, TRUE))
+
+ longlong direct_order_limit = spider_param_direct_order_limit(thd,
+ share->direct_order_limit);
+ if (direct_order_limit)
{
- DBUG_PRINT("info",("spider FALSE by condition"));
- DBUG_RETURN(FALSE);
+ if (
+ !first_check ||
+ !select_lex->explicit_limit ||
+ (select_lex->options & OPTION_FOUND_ROWS) ||
+ (
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ !spider->result_list.direct_aggregate &&
+#endif
+ (
+ select_lex->group_list.elements ||
+ select_lex->with_sum_func
+ )
+ ) ||
+ select_lex->having ||
+ !select_lex->order_list.elements ||
+ select_limit > direct_order_limit - offset_limit
+ ) {
+ DBUG_PRINT("info",("spider FALSE by select_lex"));
+ DBUG_RETURN(FALSE);
+ }
+ ORDER *order;
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if (spider->print_item_type((*order->item), NULL, NULL, 0))
+ {
+ DBUG_PRINT("info",("spider FALSE by order"));
+ DBUG_RETURN(FALSE);
+ }
+ }
+ DBUG_PRINT("info",("spider TRUE"));
+ spider->result_list.internal_limit = select_limit + offset_limit;
+ spider->result_list.split_read = select_limit + offset_limit;
+ spider->trx->direct_order_limit_count++;
+ DBUG_RETURN(TRUE);
}
- DBUG_PRINT("info",("spider TRUE"));
- spider->result_list.internal_limit = select_limit + offset_limit;
- spider->result_list.split_read = select_limit + offset_limit;
- spider->trx->direct_order_limit_count++;
- DBUG_RETURN(TRUE);
}
DBUG_PRINT("info",("spider FALSE by parameter"));
DBUG_RETURN(FALSE);