diff options
-rw-r--r-- | mysql-test/main/win_percentile.result | 14 | ||||
-rw-r--r-- | mysql-test/main/win_percentile.test | 17 | ||||
-rw-r--r-- | sql/item_windowfunc.cc | 33 |
3 files changed, 54 insertions, 10 deletions
diff --git a/mysql-test/main/win_percentile.result b/mysql-test/main/win_percentile.result index 19c400c3f2b..a2ca775fcfb 100644 --- a/mysql-test/main/win_percentile.result +++ b/mysql-test/main/win_percentile.result @@ -451,3 +451,17 @@ Lady of the Flies 20000000000.00 Lord of the Ladybirds 30000000000.00 Lord of the Ladybirds 30000000000.00 DROP TABLE t2, t1; +# +# MDEV-20272 PERCENTILE_DISC() crashes on a temporal type input +# +CREATE OR REPLACE TABLE t1 (name CHAR(30), star_rating TIME); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', 5); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', 3); +INSERT INTO t1 VALUES ('Lady of the Flies', 1); +INSERT INTO t1 VALUES ('Lady of the Flies', 2); +INSERT INTO t1 VALUES ('Lady of the Flies', 5); +SELECT name, PERCENTILE_DISC(0.5) +WITHIN GROUP (ORDER BY star_rating) +OVER (PARTITION BY name) AS pc FROM t1; +ERROR HY000: Numeric datatype is required for percentile_disc function +DROP TABLE t1; diff --git a/mysql-test/main/win_percentile.test b/mysql-test/main/win_percentile.test index 2b3fffc4508..8705be123ff 100644 --- a/mysql-test/main/win_percentile.test +++ b/mysql-test/main/win_percentile.test @@ -209,3 +209,20 @@ CREATE OR REPLACE TABLE t2 AS SELECT name, PERCENTILE_DISC(0.5) SHOW CREATE TABLE t2; SELECT * FROM t2 ORDER BY name, pc; DROP TABLE t2, t1; + + +--echo # +--echo # MDEV-20272 PERCENTILE_DISC() crashes on a temporal type input +--echo # + +CREATE OR REPLACE TABLE t1 (name CHAR(30), star_rating TIME); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', 5); +INSERT INTO t1 VALUES ('Lord of the Ladybirds', 3); +INSERT INTO t1 VALUES ('Lady of the Flies', 1); +INSERT INTO t1 VALUES ('Lady of the Flies', 2); +INSERT INTO t1 VALUES ('Lady of the Flies', 5); +--error ER_WRONG_TYPE_FOR_PERCENTILE_FUNC +SELECT name, PERCENTILE_DISC(0.5) + WITHIN GROUP (ORDER BY star_rating) + OVER (PARTITION BY name) AS pc FROM t1; +DROP TABLE t1; diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc index 85e5144779e..98474f62d4f 100644 --- a/sql/item_windowfunc.cc +++ b/sql/item_windowfunc.cc @@ -172,25 +172,38 @@ void Item_window_func::split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array, bool Item_window_func::check_result_type_of_order_item() { - if (only_single_element_order_list()) + switch (window_func()->sum_func()) { + case Item_sum::PERCENTILE_CONT_FUNC: { - Item *src_item= window_spec->order_list->first->item[0]; - Item_result rtype= src_item->cmp_type(); + Item_result rtype= window_spec->order_list->first->item[0]->cmp_type(); // TODO (varun) : support date type in percentile_cont function if (rtype != REAL_RESULT && rtype != INT_RESULT && rtype != DECIMAL_RESULT && rtype != TIME_RESULT) { my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name()); - return TRUE; + return true; } - if (window_func()->sum_func() == Item_sum::PERCENTILE_DISC_FUNC) + return false; + } + case Item_sum::PERCENTILE_DISC_FUNC: + { + Item *src_item= window_spec->order_list->first->item[0]; + Item_result rtype= src_item->cmp_type(); + // TODO-10.5: Fix MDEV-20280 PERCENTILE_DISC() rejects temporal and string input + if (rtype != REAL_RESULT && rtype != INT_RESULT && rtype != DECIMAL_RESULT) { - Item_sum_percentile_disc *func= - static_cast<Item_sum_percentile_disc*>(window_func()); - func->set_handler(src_item->type_handler()); - func->Type_std_attributes::set(src_item); - Type_std_attributes::set(src_item); + my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name()); + return true; } + Item_sum_percentile_disc *func= + static_cast<Item_sum_percentile_disc*>(window_func()); + func->set_handler(src_item->type_handler()); + func->Type_std_attributes::set(src_item); + Type_std_attributes::set(src_item); + return false; + } + default: + break; } return FALSE; } |