Commit 7fc86a73 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-20272 PERCENTILE_DISC() crashes on a temporal type input

parent d70dac20
...@@ -451,3 +451,17 @@ Lady of the Flies 20000000000.00 ...@@ -451,3 +451,17 @@ Lady of the Flies 20000000000.00
Lord of the Ladybirds 30000000000.00 Lord of the Ladybirds 30000000000.00
Lord of the Ladybirds 30000000000.00 Lord of the Ladybirds 30000000000.00
DROP TABLE t2, t1; 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;
...@@ -209,3 +209,20 @@ CREATE OR REPLACE TABLE t2 AS SELECT name, PERCENTILE_DISC(0.5) ...@@ -209,3 +209,20 @@ CREATE OR REPLACE TABLE t2 AS SELECT name, PERCENTILE_DISC(0.5)
SHOW CREATE TABLE t2; SHOW CREATE TABLE t2;
SELECT * FROM t2 ORDER BY name, pc; SELECT * FROM t2 ORDER BY name, pc;
DROP TABLE t2, t1; 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;
...@@ -172,25 +172,38 @@ void Item_window_func::split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array, ...@@ -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() 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= window_spec->order_list->first->item[0]->cmp_type();
Item_result rtype= src_item->cmp_type();
// TODO (varun) : support date type in percentile_cont function // TODO (varun) : support date type in percentile_cont function
if (rtype != REAL_RESULT && rtype != INT_RESULT && if (rtype != REAL_RESULT && rtype != INT_RESULT &&
rtype != DECIMAL_RESULT && rtype != TIME_RESULT) rtype != DECIMAL_RESULT && rtype != TIME_RESULT)
{ {
my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name()); my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name());
return TRUE; return true;
}
return false;
} }
if (window_func()->sum_func() == Item_sum::PERCENTILE_DISC_FUNC) 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)
{ {
my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name());
return true;
}
Item_sum_percentile_disc *func= Item_sum_percentile_disc *func=
static_cast<Item_sum_percentile_disc*>(window_func()); static_cast<Item_sum_percentile_disc*>(window_func());
func->set_handler(src_item->type_handler()); func->set_handler(src_item->type_handler());
func->Type_std_attributes::set(src_item); func->Type_std_attributes::set(src_item);
Type_std_attributes::set(src_item); Type_std_attributes::set(src_item);
return false;
} }
default:
break;
} }
return FALSE; return FALSE;
} }
......
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