Commit 43514808 authored by mskold@mysql.com's avatar mskold@mysql.com

Added support for different int sizes in condition pushdown

parent d125c6f0
...@@ -5554,8 +5554,7 @@ void ndb_serialize_cond(const Item *item, void *arg) ...@@ -5554,8 +5554,7 @@ void ndb_serialize_cond(const Item *item, void *arg)
{ {
// Currently only support for unsigned int // Currently only support for unsigned int
if (field->result_type() == INT_RESULT && if (field->result_type() == INT_RESULT &&
(field->type() != MYSQL_TYPE_LONG || !(field->flags & UNSIGNED_FLAG))
!(field->flags & UNSIGNED_FLAG)))
*context->supported_ptr= FALSE; *context->supported_ptr= FALSE;
else else
{ {
...@@ -5778,9 +5777,14 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5778,9 +5777,14 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating EQ filter")); DBUG_PRINT("info", ("Generating EQ filter %s",
filter->eq(field->getFieldNo(), field->isBig() ? "64 bit" : ""));
(Uint32) value->getIntValue()); if (field->isBig())
filter->eq(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->eq(field->getFieldNo(),
(Uint32) value->getIntValue());
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::NE_FUNC): { case(Item_func::NE_FUNC): {
...@@ -5796,9 +5800,14 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5796,9 +5800,14 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating NE filter")); DBUG_PRINT("info", ("Generating NE filter %s",
filter->ne(field->getFieldNo(), field->isBig() ? "64 bit" : ""));
(Uint32) value->getIntValue()); if (field->isBig())
filter->ne(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->ne(field->getFieldNo(),
(Uint32) value->getIntValue());
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::LT_FUNC): { case(Item_func::LT_FUNC): {
...@@ -5814,13 +5823,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5814,13 +5823,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating LT filter")); DBUG_PRINT("info", ("Generating LT filter %s",
field->isBig() ? "64 bit" : ""));
if (a == field) if (a == field)
filter->lt(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->lt(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->lt(field->getFieldNo(),
(Uint32) value->getIntValue());
}
else else
filter->gt(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->gt(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->gt(field->getFieldNo(),
(Uint32) value->getIntValue());
}
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::LE_FUNC): { case(Item_func::LE_FUNC): {
...@@ -5836,13 +5858,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5836,13 +5858,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating LE filter")); DBUG_PRINT("info", ("Generating LE filter %s",
field->isBig() ? "64 bit" : ""));
if (a == field) if (a == field)
filter->le(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->le(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->le(field->getFieldNo(),
(Uint32) value->getIntValue());
}
else else
filter->ge(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->ge(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->ge(field->getFieldNo(),
(Uint32) value->getIntValue());
}
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::GE_FUNC): { case(Item_func::GE_FUNC): {
...@@ -5858,13 +5893,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5858,13 +5893,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating GE filter")); DBUG_PRINT("info", ("Generating GE filter %s",
field->isBig() ? "64 bit" : ""));
if (a == field) if (a == field)
filter->ge(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->ge(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->ge(field->getFieldNo(),
(Uint32) value->getIntValue());
}
else else
filter->le(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->le(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->le(field->getFieldNo(),
(Uint32) value->getIntValue());
}
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::GT_FUNC): { case(Item_func::GT_FUNC): {
...@@ -5880,13 +5928,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond, ...@@ -5880,13 +5928,26 @@ ha_ndbcluster::build_scan_filter_predicate(Ndb_cond *cond,
: (b->type == NDB_FIELD)? b : (b->type == NDB_FIELD)? b
: NULL; : NULL;
if (!value || !field) break; if (!value || !field) break;
DBUG_PRINT("info", ("Generating GT filter")); DBUG_PRINT("info", ("Generating GT filter %s",
field->isBig() ? "64 bit" : ""));
if (a == field) if (a == field)
filter->gt(field->getFieldNo(), {
if (field->isBig())
filter->gt(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->gt(field->getFieldNo(),
(Uint32) value->getIntValue()); (Uint32) value->getIntValue());
}
else else
filter->lt(field->getFieldNo(), {
(Uint32) value->getIntValue()); if (field->isBig())
filter->lt(field->getFieldNo(),
(Uint64) value->getIntValue());
else
filter->lt(field->getFieldNo(),
(Uint32) value->getIntValue());
}
DBUG_RETURN(cond->next->next->next); DBUG_RETURN(cond->next->next->next);
} }
case(Item_func::LIKE_FUNC): { case(Item_func::LIKE_FUNC): {
......
...@@ -103,6 +103,11 @@ class Ndb_item { ...@@ -103,6 +103,11 @@ class Ndb_item {
Ndb_item(Item_func::Functype func_type); Ndb_item(Item_func::Functype func_type);
~Ndb_item(); ~Ndb_item();
void print(String *str); void print(String *str);
bool isBig()
{
enum_field_types type= value.field_value->field->type();
return (type == MYSQL_TYPE_LONGLONG || type == MYSQL_TYPE_INT24);
}
// Getters and Setters // Getters and Setters
longlong getIntValue() { return value.int_value; }; longlong getIntValue() { return value.int_value; };
double getRealValue() { return value.real_value; }; double getRealValue() { return value.real_value; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment