1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-09 08:01:34 +03:00

Add direct aggregates

Spider patches 026 (MDEV-7723), 031 (MDEV-7727) and 058 (MDEV-12532)

This allows the storage engine to internally compute sum and count
operations.

- Enhance sum items to be able to store the sum value directly.
- return_record_by_parent() is enabled in spider as
  HANDLER_HAS_DIRECT_AGGREGATE is defined
- Added spd_environ.h to spider. This is loaded first to ensure that all
  MariaDB specific defines that are used by include files are properly
  defined.
- This code is tested by the existing spider tests direct_aggregate.test
  and direct_aggregate_part.test and also partition.test
This commit is contained in:
Monty
2017-09-09 16:20:55 +03:00
parent 6f5a7e9227
commit da26d16dd1
28 changed files with 383 additions and 100 deletions

View File

@@ -513,6 +513,9 @@ COUNT(*)
SELECT SUM(c) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
SUM(c)
400
SELECT SUM(c+0.0) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
SUM(c+0.0)
400.0
ALTER TABLE t1 DROP INDEX b;
SELECT COUNT(*) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
COUNT(*)

View File

@@ -445,6 +445,7 @@ INSERT INTO t1 VALUES (1,1,0), (1,1,1), (1,1,2), (1,1,53), (1,1,4), (1,1,5),
(1,19,1);
SELECT COUNT(*) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
SELECT SUM(c) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
SELECT SUM(c+0.0) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
ALTER TABLE t1 DROP INDEX b;
SELECT COUNT(*) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );
SELECT SUM(c) FROM t1 WHERE b NOT IN ( 1,2,6,7,9,10,11 );

View File

@@ -4212,7 +4212,6 @@ int ha_partition::write_row(uchar * buf)
sql_mode_t saved_sql_mode= thd->variables.sql_mode;
bool saved_auto_inc_field_not_null= table->auto_increment_field_not_null;
DBUG_ENTER("ha_partition::write_row");
DBUG_ASSERT(buf == m_rec0);
/*
If we have an auto_increment column and we are writing a changed row

View File

@@ -5848,6 +5848,7 @@ public:
}
virtual void store(Item *item);
virtual Item *get_item() { return example; }
virtual bool cache_value()= 0;
bool basic_const_item() const
{ return MY_TEST(example && example->basic_const_item()); }

View File

@@ -1251,6 +1251,7 @@ Field *Item_sum_hybrid::create_tmp_field(bool group, TABLE *table)
Item_sum_sum::Item_sum_sum(THD *thd, Item_sum_sum *item)
:Item_sum_num(thd, item),
Type_handler_hybrid_field_type(item),
direct_added(FALSE), direct_reseted_field(FALSE),
curr_dec_buff(item->curr_dec_buff),
count(item->count)
{
@@ -1270,6 +1271,15 @@ Item *Item_sum_sum::copy_or_same(THD* thd)
}
void Item_sum_sum::cleanup()
{
DBUG_ENTER("Item_sum_sum::cleanup");
direct_added= direct_reseted_field= FALSE;
Item_sum_num::cleanup();
DBUG_VOID_RETURN;
}
void Item_sum_sum::clear()
{
DBUG_ENTER("Item_sum_sum::clear");
@@ -1319,6 +1329,38 @@ void Item_sum_sum::fix_length_and_dec()
}
void Item_sum_sum::direct_add(my_decimal *add_sum_decimal)
{
DBUG_ENTER("Item_sum_sum::direct_add");
DBUG_PRINT("info", ("add_sum_decimal: %p", add_sum_decimal));
direct_added= TRUE;
direct_reseted_field= FALSE;
if (add_sum_decimal)
{
direct_sum_is_null= FALSE;
direct_sum_decimal= *add_sum_decimal;
}
else
{
direct_sum_is_null= TRUE;
direct_sum_decimal= decimal_zero;
}
DBUG_VOID_RETURN;
}
void Item_sum_sum::direct_add(double add_sum_real, bool add_sum_is_null)
{
DBUG_ENTER("Item_sum_sum::direct_add");
DBUG_PRINT("info", ("add_sum_real: %f", add_sum_real));
direct_added= TRUE;
direct_reseted_field= FALSE;
direct_sum_is_null= add_sum_is_null;
direct_sum_real= add_sum_real;
DBUG_VOID_RETURN;
}
bool Item_sum_sum::add()
{
DBUG_ENTER("Item_sum_sum::add");
@@ -1332,6 +1374,23 @@ void Item_sum_sum::add_helper(bool perform_removal)
if (result_type() == DECIMAL_RESULT)
{
if (unlikely(direct_added))
{
/* Add value stored by Item_sum_sum::direct_add */
DBUG_ASSERT(!perform_removal);
direct_added= FALSE;
if (likely(!direct_sum_is_null))
{
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
&direct_sum_decimal, dec_buffs + curr_dec_buff);
curr_dec_buff^= 1;
null_value= 0;
}
}
else
{
direct_reseted_field= FALSE;
my_decimal value;
const my_decimal *val= aggr->arg_val_decimal(&value);
if (!aggr->arg_is_null(true))
@@ -1357,8 +1416,24 @@ void Item_sum_sum::add_helper(bool perform_removal)
null_value= (count > 0) ? 0 : 1;
}
}
}
else
{
if (unlikely(direct_added))
{
/* Add value stored by Item_sum_sum::direct_add */
DBUG_ASSERT(!perform_removal);
direct_added= FALSE;
if (!direct_sum_is_null)
{
sum+= direct_sum_real;
null_value= 0;
}
}
else
{
direct_reseted_field= FALSE;
if (perform_removal && count > 0)
sum-= aggr->arg_val_real();
else
@@ -1378,6 +1453,7 @@ void Item_sum_sum::add_helper(bool perform_removal)
null_value= (count > 0) ? 0 : 1;
}
}
}
DBUG_VOID_RETURN;
}
@@ -1567,6 +1643,17 @@ Item *Item_sum_count::copy_or_same(THD* thd)
}
void Item_sum_count::direct_add(longlong add_count)
{
DBUG_ENTER("Item_sum_count::direct_add");
DBUG_PRINT("info", ("add_count: %lld", add_count));
direct_counted= TRUE;
direct_reseted_field= FALSE;
direct_count= add_count;
DBUG_VOID_RETURN;
}
void Item_sum_count::clear()
{
DBUG_ENTER("Item_sum_count::clear");
@@ -1577,10 +1664,20 @@ void Item_sum_count::clear()
bool Item_sum_count::add()
{
DBUG_ENTER("Item_sum_count::add");
if (direct_counted)
{
direct_counted= FALSE;
count+= direct_count;
}
else
{
direct_reseted_field= FALSE;
if (aggr->arg_is_null(false))
return 0;
DBUG_RETURN(0);
count++;
return 0;
}
DBUG_RETURN(0);
}
@@ -1611,6 +1708,8 @@ void Item_sum_count::cleanup()
{
DBUG_ENTER("Item_sum_count::cleanup");
count= 0;
direct_counted= FALSE;
direct_reseted_field= FALSE;
Item_sum_int::cleanup();
DBUG_VOID_RETURN;
}
@@ -2031,6 +2130,7 @@ void Item_sum_hybrid::clear()
DBUG_VOID_RETURN;
}
bool
Item_sum_hybrid::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
{
@@ -2043,6 +2143,17 @@ Item_sum_hybrid::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
return retval;
}
void Item_sum_hybrid::direct_add(Item *item)
{
DBUG_ENTER("Item_sum_hybrid::direct_add");
DBUG_PRINT("info", ("item: %p", item));
direct_added= TRUE;
direct_item= item;
DBUG_VOID_RETURN;
}
double Item_sum_hybrid::val_real()
{
DBUG_ENTER("Item_sum_hybrid::val_real");
@@ -2147,8 +2258,17 @@ Item *Item_sum_min::copy_or_same(THD* thd)
bool Item_sum_min::add()
{
Item *tmp_item;
DBUG_ENTER("Item_sum_min::add");
DBUG_PRINT("enter", ("this: %p", this));
if (unlikely(direct_added))
{
/* Change to use direct_item */
tmp_item= arg_cache->get_item();
arg_cache->store(direct_item);
}
DBUG_PRINT("info", ("null_value: %s", null_value ? "TRUE" : "FALSE"));
/* args[0] < value */
arg_cache->cache_value();
if (!arg_cache->null_value &&
@@ -2158,6 +2278,12 @@ bool Item_sum_min::add()
value->cache_value();
null_value= 0;
}
if (unlikely(direct_added))
{
/* Restore original item */
direct_added= FALSE;
arg_cache->store(tmp_item);
}
DBUG_RETURN(0);
}
@@ -2172,8 +2298,16 @@ Item *Item_sum_max::copy_or_same(THD* thd)
bool Item_sum_max::add()
{
Item *tmp_item;
DBUG_ENTER("Item_sum_max::add");
DBUG_PRINT("enter", ("this: %p", this));
if (unlikely(direct_added))
{
/* Change to use direct_item */
tmp_item= arg_cache->get_item();
arg_cache->store(direct_item);
}
/* args[0] > value */
arg_cache->cache_value();
DBUG_PRINT("info", ("null_value: %s", null_value ? "TRUE" : "FALSE"));
@@ -2184,6 +2318,12 @@ bool Item_sum_max::add()
value->cache_value();
null_value= 0;
}
if (unlikely(direct_added))
{
/* Restore original item */
direct_added= FALSE;
arg_cache->store(tmp_item);
}
DBUG_RETURN(0);
}
@@ -2363,15 +2503,26 @@ void Item_sum_num::reset_field()
void Item_sum_hybrid::reset_field()
{
Item *tmp_item, *arg0;
DBUG_ENTER("Item_sum_hybrid::reset_field");
arg0= args[0];
if (unlikely(direct_added))
{
/* Switch to use direct item */
tmp_item= value->get_item();
value->store(direct_item);
arg0= direct_item;
}
switch(result_type()) {
case STRING_RESULT:
{
char buff[MAX_FIELD_WIDTH];
String tmp(buff,sizeof(buff),result_field->charset()),*res;
res=args[0]->val_str(&tmp);
if (args[0]->null_value)
res= arg0->val_str(&tmp);
if (arg0->null_value)
{
result_field->set_null();
result_field->reset();
@@ -2385,11 +2536,11 @@ void Item_sum_hybrid::reset_field()
}
case INT_RESULT:
{
longlong nr=args[0]->val_int();
longlong nr= arg0->val_int();
if (maybe_null)
{
if (args[0]->null_value)
if (arg0->null_value)
{
nr=0;
result_field->set_null();
@@ -2403,11 +2554,11 @@ void Item_sum_hybrid::reset_field()
}
case REAL_RESULT:
{
double nr= args[0]->val_real();
double nr= arg0->val_real();
if (maybe_null)
{
if (args[0]->null_value)
if (arg0->null_value)
{
nr=0.0;
result_field->set_null();
@@ -2420,11 +2571,11 @@ void Item_sum_hybrid::reset_field()
}
case DECIMAL_RESULT:
{
my_decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
my_decimal value_buff, *arg_dec= arg0->val_decimal(&value_buff);
if (maybe_null)
{
if (args[0]->null_value)
if (arg0->null_value)
result_field->set_null();
else
result_field->set_notnull();
@@ -2442,27 +2593,49 @@ void Item_sum_hybrid::reset_field()
case TIME_RESULT:
DBUG_ASSERT(0);
}
if (unlikely(direct_added))
{
direct_added= FALSE;
value->store(tmp_item);
}
DBUG_VOID_RETURN;
}
void Item_sum_sum::reset_field()
{
my_bool null_flag;
DBUG_ASSERT (aggr->Aggrtype() != Aggregator::DISTINCT_AGGREGATOR);
if (result_type() == DECIMAL_RESULT)
{
my_decimal value, *arg_val= args[0]->val_decimal(&value);
if (!arg_val) // Null
arg_val= &decimal_zero;
my_decimal value, *arg_val;
if (unlikely(direct_added))
arg_val= &direct_sum_decimal;
else
{
if (!(arg_val= args[0]->val_decimal(&value)))
arg_val= &decimal_zero; // Null
}
result_field->store_decimal(arg_val);
}
else
{
DBUG_ASSERT(result_type() == REAL_RESULT);
double nr= args[0]->val_real(); // Nulls also return 0
double nr= likely(!direct_added) ? args[0]->val_real() : direct_sum_real;
float8store(result_field->ptr, nr);
}
if (args[0]->null_value)
if (unlikely(direct_added))
{
direct_added= FALSE;
direct_reseted_field= TRUE;
null_flag= direct_sum_is_null;
}
else
null_flag= args[0]->null_value;
if (null_flag)
result_field->set_null();
else
result_field->set_notnull();
@@ -2476,7 +2649,13 @@ void Item_sum_count::reset_field()
longlong nr=0;
DBUG_ASSERT (aggr->Aggrtype() != Aggregator::DISTINCT_AGGREGATOR);
if (!args[0]->maybe_null || !args[0]->is_null())
if (unlikely(direct_counted))
{
nr= direct_count;
direct_counted= FALSE;
direct_reseted_field= TRUE;
}
else if (!args[0]->maybe_null || !args[0]->is_null())
nr= 1;
DBUG_PRINT("info", ("nr: %lld", nr));
int8store(res,nr);
@@ -2548,13 +2727,26 @@ void Item_sum_sum::update_field()
DBUG_ASSERT (aggr->Aggrtype() != Aggregator::DISTINCT_AGGREGATOR);
if (result_type() == DECIMAL_RESULT)
{
my_decimal value, *arg_val= args[0]->val_decimal(&value);
if (!args[0]->null_value)
my_decimal value, *arg_val;
my_bool null_flag;
if (unlikely(direct_added || direct_reseted_field))
{
direct_added= direct_reseted_field= FALSE;
arg_val= &direct_sum_decimal;
null_flag= direct_sum_is_null;
}
else
{
arg_val= args[0]->val_decimal(&value);
null_flag= args[0]->null_value;
}
if (!null_flag)
{
if (!result_field->is_null())
{
my_decimal field_value,
*field_val= result_field->val_decimal(&field_value);
my_decimal field_value;
my_decimal *field_val= result_field->val_decimal(&field_value);
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
result_field->store_decimal(dec_buffs);
}
@@ -2569,10 +2761,21 @@ void Item_sum_sum::update_field()
{
double old_nr,nr;
uchar *res= result_field->ptr;
my_bool null_flag;
float8get(old_nr,res);
if (unlikely(direct_added || direct_reseted_field))
{
direct_added= direct_reseted_field= FALSE;
null_flag= direct_sum_is_null;
nr= direct_sum_real;
}
else
{
nr= args[0]->val_real();
if (!args[0]->null_value)
null_flag= args[0]->null_value;
}
if (!null_flag)
{
old_nr+=nr;
result_field->set_notnull();
@@ -2589,8 +2792,14 @@ void Item_sum_count::update_field()
uchar *res=result_field->ptr;
nr=sint8korr(res);
if (!args[0]->maybe_null || !args[0]->is_null())
if (unlikely(direct_counted || direct_reseted_field))
{
direct_counted= direct_reseted_field= FALSE;
nr+= direct_count;
}
else if (!args[0]->maybe_null || !args[0]->is_null())
nr++;
DBUG_PRINT("info", ("nr: %lld", nr));
int8store(res,nr);
DBUG_VOID_RETURN;
}
@@ -2651,6 +2860,12 @@ Item *Item_sum_avg::result_item(THD *thd, Field *field)
void Item_sum_hybrid::update_field()
{
DBUG_ENTER("Item_sum_hybrid::update_field");
Item *tmp_item;
if (unlikely(direct_added))
{
tmp_item= args[0];
args[0]= direct_item;
}
switch (result_type()) {
case STRING_RESULT:
min_max_update_str_field();
@@ -2664,6 +2879,11 @@ void Item_sum_hybrid::update_field()
default:
min_max_update_real_field();
}
if (unlikely(direct_added))
{
direct_added= FALSE;
args[0]= tmp_item;
}
DBUG_VOID_RETURN;
}

View File

@@ -521,6 +521,7 @@ public:
Item *get_arg(uint i) const { return args[i]; }
Item *set_arg(uint i, THD *thd, Item *new_val);
uint get_arg_count() const { return arg_count; }
virtual Item **get_args() { return fixed ? orig_args : args; }
/* Initialization of distinct related members */
void init_aggregator()
@@ -757,14 +758,20 @@ class Item_sum_sum :public Item_sum_num,
public Type_handler_hybrid_field_type
{
protected:
bool direct_added;
bool direct_reseted_field;
bool direct_sum_is_null;
double direct_sum_real;
double sum;
my_decimal direct_sum_decimal;
my_decimal dec_buffs[2];
uint curr_dec_buff;
void fix_length_and_dec();
public:
Item_sum_sum(THD *thd, Item *item_par, bool distinct):
Item_sum_num(thd, item_par)
Item_sum_num(thd, item_par), direct_added(FALSE),
direct_reseted_field(FALSE)
{
set_distinct(distinct);
}
@@ -773,6 +780,9 @@ public:
{
return has_with_distinct() ? SUM_DISTINCT_FUNC : SUM_FUNC;
}
void cleanup();
void direct_add(my_decimal *add_sum_decimal);
void direct_add(double add_sum_real, bool add_sum_is_null);
void clear();
bool add();
double val_real();
@@ -808,6 +818,9 @@ private:
class Item_sum_count :public Item_sum_int
{
bool direct_counted;
bool direct_reseted_field;
longlong direct_count;
longlong count;
friend class Aggregator_distinct;
@@ -819,7 +832,8 @@ class Item_sum_count :public Item_sum_int
public:
Item_sum_count(THD *thd, Item *item_par):
Item_sum_int(thd, item_par), count(0)
Item_sum_int(thd, item_par), direct_counted(FALSE),
direct_reseted_field(FALSE), count(0)
{}
/**
@@ -831,12 +845,14 @@ class Item_sum_count :public Item_sum_int
*/
Item_sum_count(THD *thd, List<Item> &list):
Item_sum_int(thd, list), count(0)
Item_sum_int(thd, list), direct_counted(FALSE),
direct_reseted_field(FALSE), count(0)
{
set_distinct(TRUE);
}
Item_sum_count(THD *thd, Item_sum_count *item):
Item_sum_int(thd, item), count(item->count)
Item_sum_int(thd, item), direct_counted(FALSE),
direct_reseted_field(FALSE), count(item->count)
{}
enum Sumfunctype sum_func () const
{
@@ -851,6 +867,7 @@ class Item_sum_count :public Item_sum_int
longlong val_int();
void reset_field();
void update_field();
void direct_add(longlong add_count);
const char *func_name() const
{
return has_with_distinct() ? "count(distinct " : "count(";
@@ -1009,6 +1026,8 @@ class Item_cache;
class Item_sum_hybrid :public Item_sum, public Type_handler_hybrid_field_type
{
protected:
bool direct_added;
Item *direct_item;
Item_cache *value, *arg_cache;
Arg_comparator *cmp;
int cmp_sign;
@@ -1019,19 +1038,20 @@ protected:
Item_sum_hybrid(THD *thd, Item *item_par,int sign):
Item_sum(thd, item_par),
Type_handler_hybrid_field_type(&type_handler_longlong),
value(0), arg_cache(0), cmp(0),
direct_added(FALSE), value(0), arg_cache(0), cmp(0),
cmp_sign(sign), was_values(TRUE)
{ collation.set(&my_charset_bin); }
Item_sum_hybrid(THD *thd, Item_sum_hybrid *item)
:Item_sum(thd, item),
Type_handler_hybrid_field_type(item),
value(item->value), arg_cache(0),
direct_added(FALSE), value(item->value), arg_cache(0),
cmp_sign(item->cmp_sign), was_values(item->was_values)
{ }
bool fix_fields(THD *, Item **);
void fix_length_and_dec();
void setup_hybrid(THD *thd, Item *item, Item *value_arg);
void clear();
void direct_add(Item *item);
double val_real();
longlong val_int();
my_decimal *val_decimal(my_decimal *);

View File

@@ -20,6 +20,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -17,18 +17,7 @@
#pragma interface
#endif
#if (defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000)
#define SPIDER_HANDLER_START_BULK_INSERT_HAS_FLAGS
#endif
#if MYSQL_VERSION_ID >= 100203
#define HANDLER_HAS_TOP_TABLE_FIELDS
#define PARTITION_HAS_EXTRA_ATTACH_CHILDREN
#define PARTITION_HAS_GET_CHILD_HANDLERS
#define PARTITION_HAS_EXTRA_ATTACH_CHILDREN
#define PARTITION_HAS_GET_CHILD_HANDLERS
#define HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN
#endif
#include "spd_environ.h"
#define SPIDER_CONNECT_INFO_MAX_LEN 64
#define SPIDER_CONNECT_INFO_PATH_MAX_LEN FN_REFLEN

View File

@@ -54,31 +54,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 1
SELECT MAX(a) FROM ta_l;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 2
SELECT MIN(a) FROM ta_l;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 3
SELECT MAX(a) FROM ta_l WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 5
deinit
connection master_1;

View File

@@ -44,31 +44,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l2;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l2;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 6
SELECT MAX(a) FROM ta_l2 WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 8
SELECT MIN(a) FROM ta_l2 WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 10
deinit
connection master_1;

View File

@@ -54,31 +54,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 1
SELECT MAX(a) FROM ta_l;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 2
SELECT MIN(a) FROM ta_l;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 3
SELECT MAX(a) FROM ta_l WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 5
deinit
connection master_1;

View File

@@ -44,31 +44,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l2;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l2;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 6
SELECT MAX(a) FROM ta_l2 WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 8
SELECT MIN(a) FROM ta_l2 WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
Spider_direct_aggregate 0
Spider_direct_aggregate 10
deinit
connection master_1;

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -0,0 +1,35 @@
/* Copyright (C) 2008-2015 Kentoku Shiba & 2017 MariaDB corp
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
Define functinolity offered by MySQL or MariaDB
*/
#ifndef SPD_ENVIRON_INCLUDED
#if (defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000)
#define SPIDER_HANDLER_START_BULK_INSERT_HAS_FLAGS
#endif
#if MYSQL_VERSION_ID >= 100204
#define HANDLER_HAS_TOP_TABLE_FIELDS
#define HANDLER_HAS_DIRECT_AGGREGATE
#define PARTITION_HAS_EXTRA_ATTACH_CHILDREN
#define PARTITION_HAS_GET_CHILD_HANDLERS
#define PARTITION_HAS_EXTRA_ATTACH_CHILDREN
#define PARTITION_HAS_GET_CHILD_HANDLERS
#define HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN
#endif
#endif /* SPD_ENVIRON_INCLUDED */

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -17,6 +17,7 @@
#include <my_global.h>
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>

View File

@@ -16,6 +16,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>