From bc6de959c2118f6151434bf34d00a9ec1482c2e2 Mon Sep 17 00:00:00 2001 From: dimitrisstaratzis Date: Mon, 26 Aug 2024 20:56:20 +0300 Subject: [PATCH 1/3] Fix dimension filtering with BETWEEN in date-type Dims --- mytile/ha_mytile.cc | 28 +++++++++++++++++++++------- mytile/mytile-range.cc | 7 +++++++ mytile/mytile-range.h | 2 ++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/mytile/ha_mytile.cc b/mytile/ha_mytile.cc index 221cae59..878f01bc 100644 --- a/mytile/ha_mytile.cc +++ b/mytile/ha_mytile.cc @@ -2029,7 +2029,9 @@ const COND *tile::mytile::cond_push_func_datetime( // We should add support at some point for handling functions (i.e. // date_dimension = current_date()) for (uint i = 1; i < func_item->argument_count(); i++) { - if (args[i]->type() != Item::CONST_ITEM) { + if (args[i]->type() != Item::CONST_ITEM && + func_item->functype() != Item_func::BETWEEN) { + // datetime args in 'BETWEEN' are not constants DBUG_RETURN(func_item); } } @@ -2211,21 +2213,24 @@ const COND *tile::mytile::cond_push_func_datetime( break; } - case Item_func::BETWEEN: { + case Item_func::BETWEEN: neg = (dynamic_cast(func_item))->negated; if (neg) // don't support negations! DBUG_RETURN(func_item); - } // fall through case Item_func::LE_FUNC: // Handle all cases where there is 1 or 2 arguments // we must set on case Item_func::LT_FUNC: case Item_func::GE_FUNC: case Item_func::GT_FUNC: { + bool between = false; // the range Item_basic_constant *lower_const = nullptr; Item_basic_constant *upper_const = nullptr; + Item *lower_item_between = nullptr; + Item *upper_item_between = nullptr; + // Get field type for comparison Item_result cmp_type = args[1]->cmp_type(); @@ -2235,8 +2240,9 @@ const COND *tile::mytile::cond_push_func_datetime( // If we have 3 items then we can set lower and upper if (func_item->argument_count() == 3) { - lower_const = dynamic_cast(args[1]); - upper_const = dynamic_cast(args[2]); + between = true; + lower_item_between = args[1]; + upper_item_between = args[2]; // If the condition is less than we know its the upper limit we have } else if (func_item->functype() == Item_func::LT_FUNC || func_item->functype() == Item_func::LE_FUNC) { @@ -2253,8 +2259,16 @@ const COND *tile::mytile::cond_push_func_datetime( std::unique_ptr(nullptr, &std::free), func_item->functype(), tiledb_datatype_t::TILEDB_ANY, 0, 0}); - int ret = set_range_from_item_datetime(ha_thd(), lower_const, upper_const, - cmp_type, range, datatype); + int ret; + if (between) { + ret = set_range_from_item_datetime(ha_thd(), lower_item_between, + upper_item_between, cmp_type, range, + datatype); + } else { + + ret = set_range_from_item_datetime(ha_thd(), lower_const, upper_const, + cmp_type, range, datatype); + } if (ret) DBUG_RETURN(func_item); diff --git a/mytile/mytile-range.cc b/mytile/mytile-range.cc index b061f515..9607b941 100644 --- a/mytile/mytile-range.cc +++ b/mytile/mytile-range.cc @@ -595,10 +595,12 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, case tiledb_datatype_t::TILEDB_TIME_FS: case tiledb_datatype_t::TILEDB_TIME_AS: { if (lower_const != nullptr) { + std::cout << "no null lower" << std::endl; lower_const->get_date(thd, &lower_date, date_mode_t(0)); lower = MysqlTimeToTileDBTimeVal(thd, lower_date, datatype); } if (upper_const != nullptr) { + std::cout << "no null upper" << std::endl; upper_const->get_date(thd, &upper_date, date_mode_t(0)); upper = MysqlTimeToTileDBTimeVal(thd, upper_date, datatype); } @@ -624,6 +626,9 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, *static_cast(range->lower_value.get()) = static_cast(lower); range->lower_value_size = sizeof(int64_t); + + std::cout << "lower-" << static_cast(lower) << std::endl; + } if (upper_const != nullptr) { @@ -639,6 +644,8 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, *static_cast(range->upper_value.get()) = static_cast(upper); range->upper_value_size = sizeof(int64_t); + + std::cout << "upper-" << static_cast(upper) << std::endl; } DBUG_RETURN(0); diff --git a/mytile/mytile-range.h b/mytile/mytile-range.h index 4a842a24..551dc2c5 100644 --- a/mytile/mytile-range.h +++ b/mytile/mytile-range.h @@ -185,6 +185,8 @@ void setup_range(THD *thd, const std::shared_ptr &range, } // endswitch functype // log conditions for debug + std::cout << "pushed: "<< std::to_string(*static_cast(range->lower_value.get())).c_str() << " _ " << std::to_string(*static_cast(range->upper_value.get())).c_str() << std::endl; + log_debug( thd, "pushed conditions: [%s, %s]", std::to_string(*static_cast(range->lower_value.get())).c_str(), From 9e07fc2a14e7a55049c35bf5c326e51556a425bd Mon Sep 17 00:00:00 2001 From: dimitrisstaratzis Date: Tue, 27 Aug 2024 14:21:49 +0300 Subject: [PATCH 2/3] format --- mytile/mytile-range.cc | 2 -- mytile/mytile-range.h | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/mytile/mytile-range.cc b/mytile/mytile-range.cc index 9607b941..a2c7410d 100644 --- a/mytile/mytile-range.cc +++ b/mytile/mytile-range.cc @@ -595,12 +595,10 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, case tiledb_datatype_t::TILEDB_TIME_FS: case tiledb_datatype_t::TILEDB_TIME_AS: { if (lower_const != nullptr) { - std::cout << "no null lower" << std::endl; lower_const->get_date(thd, &lower_date, date_mode_t(0)); lower = MysqlTimeToTileDBTimeVal(thd, lower_date, datatype); } if (upper_const != nullptr) { - std::cout << "no null upper" << std::endl; upper_const->get_date(thd, &upper_date, date_mode_t(0)); upper = MysqlTimeToTileDBTimeVal(thd, upper_date, datatype); } diff --git a/mytile/mytile-range.h b/mytile/mytile-range.h index 551dc2c5..be1fcd26 100644 --- a/mytile/mytile-range.h +++ b/mytile/mytile-range.h @@ -184,9 +184,7 @@ void setup_range(THD *thd, const std::shared_ptr &range, break; // DBUG_RETURN(NULL); } // endswitch functype - // log conditions for debug - std::cout << "pushed: "<< std::to_string(*static_cast(range->lower_value.get())).c_str() << " _ " << std::to_string(*static_cast(range->upper_value.get())).c_str() << std::endl; - + // log conditions for debug log_debug( thd, "pushed conditions: [%s, %s]", std::to_string(*static_cast(range->lower_value.get())).c_str(), From 93cbd8fc58dab1c13cae4794f32c34a542c55ae6 Mon Sep 17 00:00:00 2001 From: dimitrisstaratzis Date: Tue, 27 Aug 2024 14:24:27 +0300 Subject: [PATCH 3/3] format2 --- mytile/mytile-range.cc | 5 ----- mytile/mytile-range.h | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/mytile/mytile-range.cc b/mytile/mytile-range.cc index a2c7410d..b061f515 100644 --- a/mytile/mytile-range.cc +++ b/mytile/mytile-range.cc @@ -624,9 +624,6 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, *static_cast(range->lower_value.get()) = static_cast(lower); range->lower_value_size = sizeof(int64_t); - - std::cout << "lower-" << static_cast(lower) << std::endl; - } if (upper_const != nullptr) { @@ -642,8 +639,6 @@ int tile::set_range_from_item_datetime(THD *thd, Item *lower_const, *static_cast(range->upper_value.get()) = static_cast(upper); range->upper_value_size = sizeof(int64_t); - - std::cout << "upper-" << static_cast(upper) << std::endl; } DBUG_RETURN(0); diff --git a/mytile/mytile-range.h b/mytile/mytile-range.h index be1fcd26..4a842a24 100644 --- a/mytile/mytile-range.h +++ b/mytile/mytile-range.h @@ -184,7 +184,7 @@ void setup_range(THD *thd, const std::shared_ptr &range, break; // DBUG_RETURN(NULL); } // endswitch functype - // log conditions for debug + // log conditions for debug log_debug( thd, "pushed conditions: [%s, %s]", std::to_string(*static_cast(range->lower_value.get())).c_str(),